我收集了以下文件:
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
这不需要任何排序,但匹配整行。
我认为第二次尝试很接近,但需要更改才能只查看第二列和第三列而不是整行。有谁知道如何融入这个?
答案 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