我有很多已合并的 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