如何使用bash按列值过滤csv并删除基于多列的重复项

时间:2016-10-13 17:16:07

标签: bash csv awk

我尝试按一列的值过滤我的CSV,然后根据2列的值删除重复的行。为简单起见,这是一个例子。我想根据列ID1,ID2和Year删除重复的行。我还想通过仅用" 3"拉回行来过滤我的结果。在VALUE列中。

ID1,ID2,YEAR,LAT,LON,VALUE  
A,B,2016,123,456,3  
A,B,2016,133,466,3  
A,B,2016,122,446,3  
C,D,2015,223,456,3  
C,D,2015,241,455,3  
A,B,2016,123,456,2  
A,B,2016,133,466,2  
A,B,2016,122,446,2  
C,D,2015,223,456,2  
C,D,2015,241,455,2  

结果:

ID1,ID2,YEAR,LAT,LON,VALUE  
A,B,2016,123,456,3  
C,D,2015,223,456,3  

2 个答案:

答案 0 :(得分:0)

您可以使用awk使用带键的关联数组作为复合值commprising $1,$2,$3

awk -F, '$NF==3 && !seen[$1,$2,$3]++' file.csv
ID1,ID2,YEAR,LAT,LON,VALUE
A,B,2016,123,456,3
C,D,2015,223,456,3

答案 1 :(得分:0)

此解决方案假设与上面提到的相同,但是在更大的扩展版本中。 如果值中有awk,则,个解决方案都无法正常工作。然后,您可以使用csvtool来分隔值。

cat file1 |  awk -F, ' $NF==3 {unq[$1,$2,$3]=$0}  END{for (i in unq){print unq[i] }}'