次のtoコマンドとの違いは何ですか?
sort -u FILE
sort FILE | uniq
sort -u
を使用すると、sort | uniq
よりもI/Oが少なくなりますが、最終的な結果は同じです。特に、sort
が中間ファイルを作成するのに十分な大きさのファイルである場合、sort -u
が使用する中間ファイルがわずかに少ないか、わずかに小さいため、ソート時に重複を排除できる可能性があります。各セット。データが非常に重複している場合、これは有益です。実際に重複が少ない場合、大きな違いはありません(パイプの1次効果と比較して、間違いなく2次のパフォーマンス効果)。
配管が適切な場合があることに注意してください。例えば:
sort FILE | uniq -c | sort -n
これにより、ファイル内の各行の出現回数順にファイルがソートされ、最も繰り返される行が最後に表示されます。 (UnixやPOSIXで慣用されているこの組み合わせを、GNU sort。
パイプを使用しないことが重要な場合があります。例えば:
sort -u -o FILE FILE
これにより、ファイルが「in situ」でソートされます。つまり、出力ファイルは-o FILE
で指定され、この操作は安全であることが保証されています(ファイルは出力用に上書きされる前に読み取られます)。
わずかな違いが1つあります。戻りコードです。
問題は、shopt -o pipefail
が設定されると、パイプされたコマンドの戻りコードは最後の戻りコードになります。そして、uniq
は常にゼロ(成功)を返します。終了コードを調べてみると、次のようなものが表示されます(pipefail
はここでは設定されていません):
pavel@lonely ~ $ sort -u file_that_doesnt_exist ; echo $?
sort: open failed: file_that_doesnt_exist: No such file or directory
2
pavel@lonely ~ $ sort file_that_doesnt_exist | uniq ; echo $?
sort: open failed: file_that_doesnt_exist: No such file or directory
0
これ以外は、コマンドは同等です。
気をつけて! 「sort -u」と「sort | uniq」が同等であることは事実ですが、ソートの追加オプションがあると同等性が損なわれる可能性があります。 coreutilsマニュアルの例を次に示します。
たとえば、 'sort -n -u'は一意性をチェックするときに初期数値文字列の値のみを検査し、 'sort -n | uniq'は行全体を検査します。
同様に、キーフィールドで並べ替える場合、並べ替えで使用される一意性テストでは、必ずしも行全体が表示されるとは限りません。過去にそのバグに噛まれた後、最近では、Bashスクリプトを記述するときに "sort | uniq"を使用する傾向があります。むしろ、ショップの他の誰かがコードを変更して追加の並べ替えパラメーターを追加するときにその特定の落とし穴について知らないというリスクを実行するよりも、I/Oオーバーヘッドが高くなります。
sort -u
は、2つのコマンド間で出力をパイプする必要がないため、わずかに高速になります。
トピックに関する私の質問も参照してください: シェルでuniqを呼び出して異なる順序で並べ替える
何も、彼らは同じ結果を生成しません
ソートが「-u」オプションをサポートしていないサーバーで作業しました。そこで使用する必要があります
sort xyz | uniq