LINUX中如何不经过排序删除文件中重复的行(相同行,只保留一个)

LINUX中如何不经过排序删除文件中重复的行(相同行,只保留一个),第1张

楼上 uniq必须是连续的重复才行把

用awk肯定行

这是一个cu的精华帖,差不多,对于你的问题你给稍等我修改一下。(ps感谢红袖添香大姐)

CU精华 经典回顾

#假设我有如下文件

#cat aa

#123 def1 456

#345 def2 812

#123 def3 563

#322 def4 684

#123 def5 879

#......................

#现在我想把第一列中字段相同的合并,第一列不相同的则保留,合并的原则就是保留第一个出现的前两个字段,第三个字段则把结果相加,以上面的示例为例:

#

#就是对于123开头的需要合并,合并后应该成为如下:

#cat aa

#123 def1 1898

#345 def2 812

#322 def4 684

#请问用shell如何实现?

#希望各位帮助!,谢谢!!

#要求总结:

#1 合并相同的第一列数据,并且计算第三列和

#2 第二列只保留第一次出现

#3 第一列顺序不变

觉得这个问题很经典,所以从CU论坛转过来了。

请大家一起学习

我们站在巨人的肩膀上。

问题补充:

看不太懂实现可以讲一下思路吗?

a[$1]+=$3

if(length(b[$1])==0)b[$1]=$2

我是这样做的

--------------------------2

谢谢你的补充, 已经明白了你对split的适用技巧,是用split(a[$1],tmp)在碰到匹配的$1时取出以前的统计结然后再用$3加上以前的结果是吧,很巧妙。谢谢

但是有2个问题:

1不满足 第二列保留第一次出现记录(现在是保留最后一次出现)

2不满足 第一列按照原来文件顺序出现

看看这个

awk 'BEING{n=0}

{

a[$1]+=$3

if(length(b[$1])==0)b[$1]=$2

if($1 in ind)next

ind[$1]

key[n]=$1

n++

}

END{

for(i in key)print key[i],b[key[i]],a[key[i]]

}' filename

#######################

#######################

#######################

这样就行了

#!/bin/bash

awk 'BEGIN{n=0}

{

if($0 in a)next

a[$0]

b[n]=$0

n++

}

END{

for(i in b)print b[i]

}' data

前提是你的数据文件里面每行没有空格,如果有用-F设定一个没有的字符作分隔符就

man uniq

uniq file_name 删除重复的行(重复的行只保留1个)

uniq -u file_name 只保留唯一的行(重复的行全部被删除)

但它只能处理相邻的重复行

1、你得先进那个存放文件的目录,然后执行scp -P22 -rp 你要传的文件 root@另一台服务器ip地址:/要拷贝到另一台的目录。比如这样,我要传的文件在/usr下,然后想传到另一台/tmp下。我就就要执行如下命令

cd /usr

scp -P22 -rp backup.tgz.bz2 root@10.10.100.1:/tmp/

2、或者先改名你要传的文件mv backup.tgz.bz2 backup.tgz.bz2.1然后再拷过去,接着再改回来。记住不要传到对端相同一个文件夹下,不然就覆盖了


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8766074.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-21
下一篇 2023-04-21

发表评论

登录后才能评论

评论列表(0条)

保存