![Bash 命令/脚本从 CSV 中删除列中重复的行](https://linux22.com/image/30162/Bash%20%E5%91%BD%E4%BB%A4%2F%E8%84%9A%E6%9C%AC%E4%BB%8E%20CSV%20%E4%B8%AD%E5%88%A0%E9%99%A4%E5%88%97%E4%B8%AD%E9%87%8D%E5%A4%8D%E7%9A%84%E8%A1%8C.png)
我有很多已合并的 CSV 文件。然而,有重复,但整行不重复。我确实有一个列,我想将其用作搜索重复项的条件。如果该列中存在整个列中的重复项,则删除列中包含重复项的行,直到该列中拥有所有唯一值。
有谁知道在 Bash、sed 或 awk 中完成此操作的最佳方法?
答案1
awk -F, '!seen[$1]++'
$1
是第一列,酌情更改;您可以使用以逗号 ( [$1,$3]
)分隔的多列,也$0
可以使用整行。
答案2
Bash 很难,但是你能从 Bash 调用 Perl 吗?如果您的字段以逗号分隔,并且您的关键字段是第二个字段,
$ cat a.csv
11,22,33
214,22,354
6,6,6
4,5,7
1,22,1
如果还没有看到第二列,则会打印这一行:
$ perl -ne '$value = (split /,/)[1]; print unless $x{$value}++;' a.csv
11,22,33
6,6,6
4,5,7
[1] 是列号并且从零开始。
答案3
如果某些字段在引号内包含分隔符(不适用于 Ruby 1.8):
$ ruby -rcsv -e 'puts CSV.parse($<).uniq{|l|l[1]}.map(&:to_csv)' <<< $'"1,9",3\n4,8\n7,3'
"1,9",3
4,8