LINUX下去除文件中重复的行

LINUX下去除文件中重复的行,第1张

wk肯定行

这是一个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

{

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

{

if($0 in a)next

a[$0]

b[n]=$0

n++

}

END{

for(i in b)print b[i]

}' data

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

通常如果我们想获取一个文件里不重复的行的时候,我们可以直接通过 sort -u 命令,先把文件排序,然后去掉连续的重复行就行。

可是,如果我们去掉重复行之后,还想保留文件原有的顺序,该怎么办呢?

虽然 Linux 下有个看上去似乎很有用的命令叫uniq,但事实上 uniq 命令仅仅只对连续的重复行有效。

如果不排序,直接使用 uniq 命令是没有用的;使用 sort -u 的话,我们就丢失了文件原有的行的顺序了。

一个终极的解决方案是使用 awk:

简要解释一下:awk 的基本执行流程是,对文件的每一行,做一个指定的逻辑判断,如果逻辑判断成立,则执行指定的命令;如果逻辑判断不成立,则直接跳过这一行。

我们这里写的 awk 命令是!x[$0]++,意思是,首先创建一个 map 叫x,然后用当前行的全文$0作为 map 的 key,到 map 中查找相应的 value,如果没找到,则整个表达式的值为真,可以执行之后的语句;如果找到了,则表达式的值为假,跳过这一行。

由于表达式之后有++,因此如果某个 key 找不到对应的 value,该++ *** 作会先把对应的 value 设成 0,然后再自增成 1,这样下次再遇到重复的行的时候,对应的 key 就能找到一个非 0 的 value 了。

我们前面说过,awk 的流程是先判断表达式,表达式为真的时候就执行语句,可是我们前面写的这个 awk 命令里只有表达式,没有语句,那我们执行什么呢?原来,当语句被省略的时候,awk 就执行默认的语句,即打印整个完整的当前行。就这样,我们通过这个非常简短的 awk 命令实现了去除重复行并保留原有文件顺序的功能。

你算问对人咯。使用linux的comm

如果是WIN下的文件,注意先转换换行符号!!!

先对文件进行排序去重复:sort filename1 |uniq>filename1-sorted

然后对第2个文件也排序去重复并管道使用comm 找出符合你要求的:

共同拥有的行:sort filename2|uniq|comm -12 - filename1-sorted>共同拥有的

文件 filename1-sorted独有的: sort filename2|uniq|comm -13 - filename1-sorted>filename1-sorted独有

文件 filename2独有的: sort filename2|uniq|comm -23 - filename1-sorted>filename2独有。

赶紧给分,哈哈!

用comm相对比较简单,也可以用 awk做:

共同拥有的:

gakw 'ARGIND==1{a[$1]=$1} ARGIND>1{if(a[$1]!="") print $0}' file1 file2>共同拥有

gakw 'ARGIND==1{a[$1]=$1} ARGIND>1{if(a[$1]=="") print $0}' file1 file2>file2独有

gakw 'ARGIND==1{a[$1]=$1} ARGIND>1{if(a[$1]=="") print $0}' file2 file1>file1独有


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存