何度も表示されますが、値を1回だけ出力するコマンド


8

値が何度も繰り返されている大きなtxtファイルがあります。ファイルを通過する使用可能なコマンドはありますか?1つの値が表示された場合、それを再度繰り返さないでください?

SO4
HOH
CL
BME
HOH
SO4
HOH
CL
BME
HOH
SO4
HOH
SO4
HOH
CL
BME
HOH
SO4
HOH
CL
BME
HOH
CL

したがって、次のようになります。

S04   
HOH  
CL   
BME 

ことは、私は非常に多くの異なる値を持っているので、ここのように手動でそれを行うことができないということです。

回答:


11

sortのオプションを指定してコマンドを使用できます--unique

sort -u input-file

結果を標準出力ではなくFILEに書き込む場合は、オプションを使用します--output=FILE

sort -u input-file -o output-file

コマンドをuniq適用することもできます。この場合、同一の行は重要である必要があるため、入力は予備的にソートする必要があります- このメモの@RonJohnのおかげで:

sort input-file | uniq > output-file

sort単純であるため、同様のケースのコマンドが好きですが、大規模な配列で作業する場合awkは、John1024の答えからのアプローチの方が強力な場合があります。以下は、前述のアプローチ間の時間比較です。ほぼ500万行のファイル(上記の例に基づく)に適用されます。

$ cat input-file | wc -l
20000000

$ TIMEFORMAT=%R
$ time sort -u input-file | wc -l
64
7.495

$ time sort input-file | uniq | wc -l
64
7.703

$ time awk '!a[$0]++' input-file | wc -l      # from John1024's answer
64
1.271

$ time datamash rmdup 1 < input-file | wc -l  # from αғsнιη's answer
64
0.770

その他の重要な違いは@ Ruslanによって言及されたものです

sort -uこのawkコマンドは、新しい結果の各行をその場で出力しますが、入力が終了したときにのみ結果を出力します(これは、パイプ入力の場合、ファイルより重要です)。

これがイラストです:

ここに画像の説明を入力してください

上記の例では、ループ(以下を参照)は、ADの文字の500個のランダムな組み合わせを生成します。これらの組み合わせは、awkまたはにパイプされsortます。

for i in {1..500}; do cat /dev/urandom | tr -dc A-D | head -c 3; echo; done

1
とてもシンプルなコマンドです!どうもありがとう!ではごきげんよう。
djordje 2018年

2
ああ、あるユーティリティが1つのことをやって、それをうまくやった日々のために! sort input-file | uniq!!!!
RonJohn 2018年

15

入力行と同じ順序で出力行を保持したい場合は、以下を使用します。

$ awk '!a[$0]++' file
SO4
HOH
CL
BME

使い方:

これは、連想配列aを使用して、各行が以前に表示された回数をカウントします。以前に表示されていない場合は、行が印刷されます。


2
それは、非常にトリッキーですawkが、sort -u簡単な方法です。
ピエールフランソワ

4
@PierreFrançois sort -uですが、最も遅い方法でもあります:) 2つの方法の時間比較で答えを更新しました。
pa4080

4
また、sort -u入力が終了したときにのみ結果を出力しますが、このawkコマンドはその場で新しい各結果行を出力します(これは、パイプ入力の場合、ファイルより重要です)。
ルスラン

このメモをありがとう、@ Ruslan!私はそれを私の答えで説明しようとしました。
pa4080

awk解読は簡単ではありませんが、このソリューションは非常に優れていると自白しなければなりませんsort
ピエールフランソワ

1

ここでもGNU datamashを次のように使用でき、行の順序が維持されます。

datamash rmdup 1 < infile

1
time 比較によると、これはここで提供されている最速のソリューションです。
pa4080
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.