web-dev-qa-db-ja.com

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

重複データが再印刷された[csv]ファイルがあります。つまり、同じデータが2回印刷されます。 _sort myfile.csv | uniq -u_で sort's uniq を使用してみましたが、_myfile.csv_に変更はありません。また、_Sudo sort myfile.csv | uniq -u_を試しましたが、違いはありません。

だから現在私のcsvファイルはこのように見えます

_a
a
a
b
b
c
c
c
c
c_

そのようになりたい

_a
b
c_
13
3kstc

myfile.csvが変更されない理由は、uniq-uオプションがonly一意の行を印刷するためです。このファイルでは、すべての行が重複しているため、notが出力されます。

ただし、さらに重要なことに、uniqstdout(デフォルトではコンソール)に出力するだけなので、出力はmyfile.csvに保存されません。

あなたはこのようなことをする必要があるでしょう:

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

オプションの意味:

  • -u-一意の行のみを保持
  • -o-stdoutの代わりにこのファイルに出力します

詳細については、man sortをご覧ください。

16

ベルミンが示したように、並べ替えは素晴らしいです。彼の答えはソートされていないデータに最適であり、覚えて使用するのは簡単です。

ただし、入力の順序を変更するため、揮発性でもあります。どうしても同じ順序でデータを処理する必要があるが、後で重複を削除する必要がある場合は、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

私の提案の両方の欠点は、一時ファイルを使用してそれをコピーし直す必要があることです。

3
Falsenames

ファイルの順序を維持したいが(ソートされていない)、それでも重複を削除したい場合は、これを行うこともできます

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

例えば

d
d
a
a
b
b
c
c
c
c
c

出力されます

d
a
b
c
2
NinjaGaiden

niq-u一意の行のみを印刷します。入力には一意の行がないため、uniq -u何も印刷しません。 sortのみ必要です:

sort -u myfile.csv
2
cuonglm