CSVファイルから重複エントリを削除する

CSVファイルから重複エントリを削除する

重複したデータが再印刷される[csv]ファイルがあります。つまり、同じデータが2回印刷されます。使ってみました。ソートの一意性 しかし、sort myfile.csv | uniq -u何も変わりませんでしたmyfile.csv。私も試してみましたが、sudo sort myfile.csv | uniq -u違いはありませんでした。

現在私のCSVファイルは次のとおりです。

a
a
a
b
b
c
c
c
c
c

私もそう見たい

a
b
c

答え1

myfile.csv変更がない理由は-uオプションuniqですただ一意の行を印刷します。このファイルではすべての行が繰り返されるので、いいえ印刷されます。

しかし、もっと重要なのは、出力が保存されないことです。デフォルトではコンソールにのみ印刷されるmyfile.csvためです。uniqstdout

次のようにする必要があります。

$ sort -u myfile.csv -o myfile.csv

オプションの意味は次のとおりです。

  • -u- 一意の行だけを維持
  • -o- 代わりにこのファイルに出力stdout

詳細を確認する必要がありますman sort

答え2

ファイルの順序(並べ替えられていない)を維持しながら重複した項目を削除するには、次のようにすることもできます。

awk '!v[$1]++' /tmp/file

例えば

d
d
a
a
b
b
c
c
c
c
c

出力されます

d
a
b
c

答え3

ベルミンが示すように、シーケンシングは素晴らしいです。彼の答えはソートされていないデータに最も適しており、覚えていて使いやすいです。

しかし、入力の順序が変わるため、不安定なこともあります。必ず同じ順序でデータを処理する必要がありますが、後で重複したアイテムを削除する必要がある場合は、awkがより良い可能性があります。

$ cat myfile.csv
c
a
c
b
b
a
c


$ awk '{if (!($0 in x)) {print $0; x[$0]=1} }' myfile.csv
c
a
b

奇妙なケースですが、時々発生します。

また、データを表示するときにすでにソートされたデータがある場合は、uniqを実行できます。

$ cat myfile.csv 
a
a
a
b
b
c
c
c
c
c


$ uniq myfile.csv 
a
b
c

私が提案した2つの提案の欠点は、一時ファイルを使用して再コピーする必要があることです。

答え4

ユニーク -u一意の行だけが印刷されます。入力した内容には一意の行がないため、uniq -u何も印刷されません。必要なものは次のとおりですsort

sort -u myfile.csv

関連情報