我有一个用 ;
分隔的 csv。我需要删除第二列和第三列内容不唯一的行,并将 Material 传送到标准输出。
输入示例:
irrelevant;data1;data2;irrelevant;irrelevant
irrelevant;data3;data4;irrelevant;irrelevant
irrelevant;data5;data6;irrelevant;irrelevant
irrelevant;data7;data8;irrelevant;irrelevant
irrelevant;data1;data2;irrelevant;irrelevant
irrelevant;data9;data0;irrelevant;irrelevant
irrelevant;data1;data2;irrelevant;irrelevant
irrelevant;data3;data4;irrelevant;irrelevant
期望的输出
irrelevant;data5;data6;irrelevant;irrelevant
irrelevant;data7;data8;irrelevant;irrelevant
irrelevant;data9;data0;irrelevant;irrelevant
我找到了仅将第一行打印到输出的解决方案:
sort -u -t ";" -k2,1 file
但这还不够。
我尝试使用 uniq -u
但找不到仅检查几列的方法。
最佳答案
使用awk
:
awk -F';' '!seen[$2,$3]++{data[$2,$3]=$0}
END{for (i in seen) if (seen[i]==1) print data[i]}' file
irrelevant;data5;data6;irrelevant;irrelevant
irrelevant;data7;data8;irrelevant;irrelevant
irrelevant;data9;data0;irrelevant;irrelevant
解释:如果 seen
数组中不存在 $2,$3
组合,则使用键为 $2 的新条目, $3
与整个记录一起存储在 data
数组中。每次找到 $2,$3
条目时,$2,$3
的计数器就会递增。最后打印那些带有 counter==1
的条目。
关于 bash/shell : How to remove duplicates from csv file by columns?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25450514/