回答:
次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
sort input-file | uniq
!!!!
入力行と同じ順序で出力行を保持したい場合は、以下を使用します。
$ awk '!a[$0]++' file
SO4
HOH
CL
BME
使い方:
これは、連想配列a
を使用して、各行が以前に表示された回数をカウントします。以前に表示されていない場合は、行が印刷されます。
awk
が、sort -u
簡単な方法です。
sort -u
ですが、最も遅い方法でもあります:) 2つの方法の時間比較で答えを更新しました。
sort -u
入力が終了したときにのみ結果を出力しますが、このawk
コマンドはその場で新しい各結果行を出力します(これは、パイプ入力の場合、ファイルより重要です)。
awk
解読は簡単ではありませんが、このソリューションは非常に優れていると自白しなければなりませんsort
。