このタスクを検索したところ、次のような古い質問が見つかりました。
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
awk
CSVパーサーを使用する以外に解決策はありません。
私は以下を試しました:
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 1
Ref
awk
Millerに()で一般的に使用されているものと同じ種類の操作を使用させることもできますが、!seen[$1]++
Millerには後の増加演算子がないため、少し長くなります。
mlr --csv filter '@seen[$Ref] += 1; @seen[$Ref] == 1' file.csv
Millerを使用してデータをJSONに変換し、Millerを使用して操作を実行し、jq
Millerunique_by()
にデータをCSVに変換することもできます。
mlr --c2j cat file.csv | jq 'unique_by(.Ref)' | mlr --j2c cat