Bash 命令/脚本从 CSV 中删除列中重复的行

Bash 命令/脚本从 CSV 中删除列中重复的行

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

相关内容