次のコマンドの違いは何ですか?
sort -u FILE
sort FILE | uniq
を使用すると、sort -u
より少ないI / Oが実行sort | uniq
されますが、最終的な結果は同じです。特に、ファイルが十分に大きく、sort
中間ファイルを作成する必要がある場合sort -u
は、各セットを並べ替えるときに重複を排除できるため、使用する中間ファイルがわずかに少ないか、わずかに小さい可能性があります。データの重複が多い場合、これは有益である可能性があります。実際に重複がほとんどない場合、大きな違いはありません(パイプの1次効果と比較して、間違いなく2次パフォーマンス効果)。
配管が適切な場合があることに注意してください。例えば:
sort FILE | uniq -c | sort -n
これにより、ファイルがファイル内の各行の出現回数の順に並べ替えられ、最も繰り返される行が最後に表示されます。(UnixまたはPOSIXで慣用的なこの組み合わせが、GNUsortを使用した1つの複雑な「sort」コマンドに押しつぶされる可能性があることを知っても驚くことではありません。)
パイプを使わないことが重要な場合があります。例えば:
sort -u -o FILE FILE
これにより、ファイルが「その場で」ソートされます。つまり、出力ファイルはによって指定され-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を呼び出し、シェルでさまざまな順序で並べ替えます
私は、sortが「-u」オプションをサポートしていないいくつかのサーバーで作業しました。そこで使用する必要があります
sort xyz | uniq
何も、彼らは同じ結果を生成します