Grep只是部分重复之一

时间:2014-02-21 08:26:33

标签: awk grep duplicate-removal

我收集了以下文件:

20130304;114137911;8051;somevalue1
20130304;343268;7591;NA
20130304;379612;7501;somevalue2
20130304;343380;7591;somevalue8
20130304;343380;7591;somevalue9
20130304;343212;7591;NA
20130304;183278;7851;somevalue3
20130304;114141486;8051;somevalue5
20130304;114143219;8051;somevalue6
20130304;343247;7591;NA
20130304;379612;7501;somevalue2
20130308;343380;7591;NA

这是一个包含4列的;分隔文件。但是,第2列和第3列的组合必须是唯一的。由于这个数据集有数百万行,我正在寻找一种有效的方法来获得每个重复的第一次出现。因此,我需要部分匹配第2列和第3列的组合,然后选择第一列。

预期结果应为:

20130304;114137911;8051;somevalue1
20130304;343268;7591;NA
20130304;379612;7501;somevalue2
20130304;343380;7591;somevalue8
20130304;343380;7591;somevalue9 #REMOVED
20130304;343212;7591;NA
20130304;183278;7851;somevalue3
20130304;114141486;8051;somevalue5
20130304;114143219;8051;somevalue6
20130304;343247;7591;NA
20130304;379612;7501;somevalue2 #REMOVED
20130308;343380;7591;NA #$REMOVED

我自己做了几次尝试。第一个是:

grep -oE "\;(.*);" orders_20130304to20140219_v3.txt | uniq 

但是,这仅选择第2列和第3列并删除所有其他数据。此外,它没有考虑稍后发生的匹配。我可以通过添加sort来解决这个问题,但我不想排序。

另一种尝试是:

awk '!x[$0]++' test.txt

这不需要任何排序,但匹配整行。

我认为第二次尝试很接近,但需要更改才能只查看第二列和第三列而不是整行。有谁知道如何融入这个?

1 个答案:

答案 0 :(得分:7)

你去:

awk -F';' '!a[$2 FS $3]++' file

使用您的数据进行测试:

kent$  awk -F';' '!a[$2 FS $3]++' f 
20130304;114137911;8051;somevalue1
20130304;343268;7591;NA
20130304;379612;7501;somevalue2
20130304;343380;7591;somevalue8
20130304;343212;7591;NA
20130304;183278;7851;somevalue3
20130304;114141486;8051;somevalue5
20130304;114143219;8051;somevalue6
20130304;343247;7591;NA