CSVパーサーを使用して特定の列に基づいてCSV行を重複排除する

CSVパーサーを使用して特定の列に基づいてCSV行を重複排除する

このタスクを検索したところ、次のような古い質問が見つかりました。

awkしかし、私のデータは複数のネストされた二重引用符を持つ複雑なCSVファイルなので、そうすることはできません。

次のような重複を排除したいとします(単純化された状況)。

Ref,xxx,zzz
ref1,"foo, bar, base",qux
ref1,"foo, bar, base",bar
ref2,aaa,bbb

出力には次のように必要です。

Ref,xxx,zzz
ref1,"foo, bar, base",qux
ref2,aaa,bbb

awkCSVパーサーを使用する以外に解決策はありません。

私は以下を試しました:

mlr --csv uniq -a -g Ref file.csv

しかし、これは間違いです。

答え1

君は走れるよ

mlr --csv head -n 1 -g Ref input.csv

次に、グループ化された最初の行を取得します。Ref

答え2

Millerのuniqサブコマンドは、一意のレコードと一意性を決定するフィールドを返します。他のすべてのフィールドは削除されます。サブコマンドの-a(すべてのフィールドを使用)および-g(特定のフィールドを使用)オプションが互換性がないため、エラーが発生します.

Millerのみを使用する優れたソリューションすでに与えられた。 withサブコマンドを使用することは、おそらくliveをグループ化するのにhead最も便利なソリューションです。-n 1Ref

awkMillerに()で一般的に使用されているものと同じ種類の操作を使用させることもできますが、!seen[$1]++Millerには後の増加演算子がないため、少し長くなります。

mlr --csv filter '@seen[$Ref] += 1; @seen[$Ref] == 1' file.csv

Millerを使用してデータをJSONに変換し、Millerを使用して操作を実行し、jqMillerunique_by()にデータをCSVに変換することもできます。

mlr --c2j cat file.csv | jq 'unique_by(.Ref)' | mlr --j2c cat

関連情報