CSVから列の重複行を削除するBashコマンド/スクリプト

CSVから列の重複行を削除するBashコマンド/スクリプト

マージされたCSVファイルがたくさんあります。しかし、繰り返しはありますが、行全体が繰り返されるわけではありません。重複項目を検索するための基準として使用したい列があります。列全体に重複がある場合は、列に一意の値がすべて含まれるまで、重複を含む列の行を削除します。

Bash、sed、awkでこれを行う最良の方法を知っている人はいますか?

答え1

awk -F, '!seen[$1]++'

$1は最初の列です。適切に変更すると、[$1,$3]カンマ()で区切られた複数の列を使用することも、$0行全体を使用することもできます。

答え2

Bashは難しいですが、BashでPerlを呼び出すことはできますか?フィールドがカンマで区切られ、キーフィールドが2番目のフィールドである場合

$ cat a.csv
11,22,33
214,22,354
6,6,6
4,5,7
1,22,1

2番目の列がまだ表示されていない場合は、次の行が印刷されます。

$ perl -ne '$value = (split /,/)[1]; print unless $x{$value}++;' a.csv 
11,22,33
6,6,6
4,5,7

[1]は列番号で、0から始まります。

答え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

関連情報