bash/shell : How to remove duplicates from csv file by columns?

标签 bash shell sorting csv uniq

我有一个用 ; 分隔的 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/

相关文章:

linux - 生成一个值来反射(reflect)图像的平均亮度

linux - 当在 stdin 上传输数据时,调用 ausearch 的脚本的行为有所不同

java - 在Java中对数组进行递归排序,偶数出现在数组前面。

linux - 想要用一个命令完成所有行 - IFS

bash - 使用 grep 显示具有奇数个字符的行

python - 从 bash 将多个参数传递给 python 函数(在变量中)

linux - Linux中如何将一个位置的文件和子文件夹归档到另一个位置

node.js - 按数组中的最后一项排序

C 排序麻烦

bash - Bash 中数组参数的间接参数扩展