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 はそれを作業ファイルを置くディレクトリとして用います。 -T tempdir オプションも作業ディレクトリの指定に使えます。 この指定は環境変数よりも優先されます。 何も指定が無い時は /tmp を使います。

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

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

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

-f  英大文字と小文字の区別をしません。

-i  ASCII コードの8進で 040〜0176 (32〜126, 空白から `~'まで) に含まれない 文字を無視します。

-M  空白を無視した最初の文字列の先頭から 3 文字を、 月の英名の略称とみなして (大文字にした上で) 、 `JAN' < `FEB' < ... < `DEC' の順に大小関係を決めます。 月の名称でない文字列は、JAN (1月) より小さいと見なされます。

-n  文字列を、数とみなして比較します。 数は、空白(option)・- 記号(option)・数字列・小数点(option)・ 数字列(option)から構成されます。

-r  比較の順番を逆にします。 キーの昇順ではなく降順に出力します。

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

-o output-file
    結果を標準出力の代わりに、 output-file に出力します。 出力ファイル名が入力ファイルの一つと同じでも、 作業ファイルを作って処理するので問題ありません。

-t separator
    separator で指定した文字を、ソートキーを決める時のフィールド区切りとします。 デフォルトでは、空白でない文字と空白文字の間でフィールドを区切ります。 例えば、` foo bar' という行は、` foo' と ` bar' という 2 つの フィールドに分けられます。 区切り文字を指定した場合には、その文字はフィールドには含まれません。

-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 がただ一つの引数をつけて起動される時には、以下のオプションが 認識されます。

--help
    標準出力に使い方を表示して正常終了します。

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

互換性

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

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