SORT(1)

名称
sort - テキストファイルを行でソートする

書式
sort [-cmus] [-t separator] [-o output-file] [-T tempdir] [-bdfiMnr] [+POS1 [-POS2]] [-k POS1[,POS2]] [file...]
sort {--help,--version}

解説
このマニュアルページは GNU 版の sort について書かれています。 sort は、file が指定されていればそのファイルから、 ファイルが指定されない場合は標準入力からデータを読み込み、 入力した各行について、ソートやマージや比較を行います。 ファイル名 `-' は標準入力を意味します。 sort はデフォルトでは標準出力に結果を書き出します。

sort は、3 つの動作モードを持っています。 (デフォルトの) ソートと、マージと、ソートされているかどうかのチェックです。 以下のオプションで動作モードを変更します。

-c  ファイルが既にソートされたものであるかどうかチェックします。 もし、ソートされてなければ、エラーメッセージを表示すると共に、 戻り値に 1 を返します。

-m  複数のファイルをひとまとまりしてソートすることで、 それらをマージします。 個々のファイルは、あらかじめソートしておかなければなりません。 ソートはいつでもマージの代わりに動きます。 マージのオプションがあるのは、単なるマージですむ場合には、 その方がずっと高速だからです。

入力行は次のようにして比較されます。 キーフィールドが指定されている時には、 sort は、違いが見つかるかキーフィールドがなくなるまで、 コマンド行で指定された順に、キーフィールド同士を、 関連づけられた順序オプションに従い比較します。

もしグローバルオプション Mbdfinr のどれかが指定され、キーフィールドが指定されなければ、 sort はグローバルオプションにしたがって、行全体を比較します。

すべてのキーが等しい場合 (または順序を指示するオプションが全く指定されていない場合) 、 sort は最終手段として、 そのマシンでの文字の照合順 (machine collating sequence) にしたがって、 各行をバイト毎に比較します。 この最終手段においては、 -r オプションが有効です。 -s (stable) オプションは、この最終手段の比較をやめて、 全てのキーフィールドが等しい行同士の相対的な出現順を保ちます。 キーフィールドやグローバルオプションを全く指定しない時には -s は効果を持ちません。

GNU sort には、入力行の長さの制限 (行に含まれるバイト数の制限) はありません。 また、入力ファイルの最後の 1 バイトが改行文字でない時には、 GNU sort は黙って改行文字を補って処理を行います。

環境変数 TMPDIR が設定されている場合、 sort は、デフォルトの /tmp の代わりに、 これを作業ファイルを置くディレクトリとして用います。 -T tempdir オプションも作業ファイル用ディレクトリの指定に使えます。 この指定は環境変数よりも優先されます。

以下に示すオプションによって、出力行の順序付けを制御できます。 これらはグローバルに指定したり、特定のキーフィールドについて 指定することもできます。 キーフィールドを指定しない時には、 グローバルオプションは行全体の比較に適用されます。 キーフィールドを指定した時には、 それ固有の指定を持たないキーフィールドに グローバルオプションの動作が継承されます。

-b  ソートキーを見つける時、先頭にある空白を無視します。

-d  `電話帳順' でソートします。アルファベット、数字、空白以外の文字を無視します。

-f  英小文字は大文字に直してソートします。 例えば、`b' は `B' と同様にソートされます。

-i  ASCII である 040〜0176 (8進、両端を含む) の範囲に含まれない 文字を無視します。

-M  行先頭にある、空白の後ろに月の英語名の略称が続いた文字列を、 大文字に変換した上で、 `JAN' < `FEB' < ... < `DEC' の順で比較します。 月の名称でない文字列は、月の名称の文字列より小さいと見なされます。

-n  行先頭にある数字列を、数値として比較します。 数字列は、空白 (オプション)、マイナス符号 (オプション)、 0 個以上の数字、小数点と 0 個以上の数字の組 (オプション) から構成されます。

-r  比較結果を逆にし、より大きなキー値を持つ行が出力で 先に出てくるようにします。

その他のオプションは以下の通りです。

-o output-file
    結果を標準出力の代わりに、 output-file に出力します。 output-file が入力ファイルの 1 つである場合、 sort はソートし結果を書き出す前に、 その入力ファイルを作業ファイルにコピーします。

-t separator
    文字 separator を、各行でソートキーを決める時のフィールド区切りとします。 デフォルトでは、空白でない文字と空白文字の間でフィールドを区切ります。 例えば、` foo bar' という行は、` foo' と ` bar' という 2 つの フィールドに分けられます。 すなわち、入力行 ` foo bar' が与えられた場合、 sort は、この行をフィールド ` foo' と ` bar' に分割します。 フィールド区切りの文字は、その前のフィールドの一部と見なされず、また、 その後のフィールドの一部とも見なされません。

-u  デフォルトの場合、および -m オプションが指定された場合、比較して等しいとされた行のうち 最初の 1 行だけ出力し、後は出力しないようにします。 -c オプションが指定された場合は、 同じ内容の行が連続しないことをチェックします。

+POS1 [-POS2]
    行の中で、ソートのキーとして使うフィールドを指定します。 フィールドは、行の中で、位置 POS1 から始まり 位置 POS2 まで (POS2 は含まず) の部分からなります。 フィールドの位置と文字の位置は、ともに 0 から数え始めます。

-k POS1[,POS2]
    ソートキーを指定するもう 1 つの書式です。 フィールドの位置と文字の位置は、ともに 1 から数え始めます。

位置の指定は、f.c の形式を持ちます。 f はフィールド番号の指定であり、 c は、(+posの場合) フィールドの先頭から数えた先頭文字の番号、 あるいは、 (-posの場合) 直前のフィールドの末尾から数えた先頭文字の番号の 指定です。 フィールド内の最初の文字を指定する場合には、.c の部分を 省略することができます。 -b オプションが与えられた場合、フィールド指定の .c の部分は、 (+posの場合) そのフィールド内の最初の非空白文字から、 あるいは、 (-posの場合) 直前のフィールドの後ろの最初の非空白文字から 数えた位置の指定になります。

引数 +pos や -pos には、オプション文字 Mbdfinr を後ろに付けることもできます。 その場合には、このフィールドにはグローバルな順序づけオプションは 適用されません。 -b オプションは、+pos と -pos のそれぞれに独立に 指定できますが、グローバルな指定が継承される場合には 両方に指定されたように働きます。 -n または -M オプションが指定された場合、 -b オプションが暗黙のうちに指定されることになりますが、この -b オプションは、キー指定の +pos と -pos の両方に働きます。 キーは複数のフィールドに跨っても構いません。

上記に加え、 GNU sort が引数 1 個だけ付けて起動される時には、以下のオプションが 認識されます。

--help
    標準出力に使い方のメッセージを表示して正常終了します。

--version
    標準出力にバージョン情報を表示して正常終了します。

互換性
sort の歴史的な実装 (BSD や System V) とは、いくつかのオプション、特に -b, -f, -n、 の解釈が異なります。 GNU sort は POSIX の動作に従いますが、その動作は、普通 (必ずではない) System V の動作と似ています。 POSIX によれば、 -n は -b を暗黙に指定しなくなりました。 整合性を取るために、 -M も同じように変更されました。 この結果、あいまいな場合には、フィールド指定中の文字の位置の意味が 影響される場合があるかも知れません。 この問題にぶち当たったら、対応策は、明示的に -b を指定することです。

バグ
-k の有り無しによりフィールド番号の意味が異なるのは混乱の元です。 この件についてはすべて POSIX が悪いのです。