Grep只是部分重复之一

Max*_*den 0 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

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

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

Ken*_*ent 7

干得好:

awk -F';' '!a[$2 FS $3]++' file
Run Code Online (Sandbox Code Playgroud)

测试您的数据:

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
Run Code Online (Sandbox Code Playgroud)

  • @Jotne`a [$ 2 $ 3]`不是好习惯.想想一行有"11; 22",另一行有"112; 2" (4认同)