マージされた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