Linux:按具有相同值的列合并行

时间:2014-05-22 12:41:17

标签: linux bash file merge

有没有办法合并像:

这样的行
7072;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7079;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7091;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7113;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7128;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7159;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7168;understand;-;F;18;IT;MN;2009-03-18 00:00:00

只有一个:

7072;understand;-;F;18;IT;MN;2009-03-18 00:00:00

基本上,我需要:
1.从第1列获取在2列n列(7072,7079,7091)上具有相同值的数字(ID) 2.删除重复项:只留下第一个(7072) 还有其他条目,如

7072;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7079;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7091;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7113;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7128;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7159;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7168;mistify;-;F;18;IT;MN;2009-03-18 00:00:00

我只需要离开7072。 最后,似乎我必须得到这些数字并做替换,如

sed 's/^id;.*//g' 

2 个答案:

答案 0 :(得分:1)

要删除基于第二列(即understandmystify)的重复项,您可以使用以下awk脚本来保留该行的第一个副本并过滤其他所有内容:< / p>

awk -F';' '!seen[$2]++' file

对于如下文件:

$ cat file
7072;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7079;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7091;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7113;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7128;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7159;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7168;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7072;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7079;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7091;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7113;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7128;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7159;mistify;-;F;18;IT;MN;2009-03-18 00:00:00
7168;mistify;-;F;18;IT;MN;2009-03-18 00:00:00

它将产生一个输出(仅保留第一次出现并过滤其他所有内容)

$ awk -F';' '!seen[$2]++' file
7072;understand;-;F;18;IT;MN;2009-03-18 00:00:00
7072;mistify;-;F;18;IT;MN;2009-03-18 00:00:00

我们创建一个数组seen并使用第二列作为键。当第一次看到这条线时,我们数组中它的计数为零,所以我们否定它,使得值为1,我们默认打印它。随后的所有时间值都将大于0,所以我们否定它使其为0并对其进行过滤。

如果这不是您想要的,请更新您的问题,以根据一些示例数据显示您所需的输出。

答案 1 :(得分:0)

除非我不理解您的问题,否则以下内容将为您提供所要求的输出:

$ uniq -s 4 input.txt |cut -d ";" -f 1

7072
7072