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


13

重複したデータが再印刷された[csv]ファイルがあります。つまり、同じデータが2回印刷されます。私が使って試したソートのuniqのを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

sort -u myfile.csv> tmp.csv; mv -f tmp.csv myfile.csv
Archemar

によるとman sort、「その場で」並べ替えることはできません。
Archemar

端末に依存しないようにすることもできます。代わりにこのオンラインツールを試すことができます
。textmechanic.com/

回答:


16

理由myfile.csvので、変更されていませんがある-uためのオプションがuniqします唯一のユニークな行を印刷します。このファイルでは、すべての行が重複しているため、印刷されません

しかし、もっと重要なのは、出力がで保存されませんmyfile.csvので、uniqちょうどそれをプリントアウトしますstdout(デフォルトでは、お使いのコンソールによって)。

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

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

オプションの意味:

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

man sort詳細については、表示する必要があります。


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

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

sort -u myfile.csv

2

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

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

例えば

d
d
a
a
b
b
c
c
c
c
c

出力されます

d
a
b
c

構文を拡張していただけませんか?
Sopalajo de Arrierez

文字列をハッシュに配置します。文字列がハッシュに存在しない場合は、出力します。
忍者外伝
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.