名前


sort - テキストファイルをソートする

書式


sort [-cm] [-bdfginruzM] [+POS1[-POS2] [-o OUTFILE] [-t SEPARATOR] [-k POS1[,POS2] [-K POS1[,POS2] [-S SIZE] [-T TEMPDIR] [--reverse] [FILE...]

sort [--help] [--version]

説明


sort は与えられた各 FILE をソート・マージ・比較する。結果は結合されて標準出力に書き出される。 FILE が一つも与えられないと標準入力から読み込む。また FILE が ‘-’ だった場合には、そのファイルには標準入力が用いられる。

GNU sort は (他の GNU ユーティリティと同じく) 入力ファイルの行の長さや、行あたりのバイト数に制限はない。 また入力ファイルの最後が改行でなければ、 sort は黙って改行を一つ追加する。

エラーが起こると、 sort はステータス 2 で終了する。 環境変数 TMPDIR が設定されていると、 sort は一時ファイルの置き場所として、デフォルトの /tmp の代わりにそのディレ クトリを用いる。オプション -T TEMPDIR でも一時ファイルを置くディレクトリを指定できる。 オプションは環境変数より優先される。

-k+ オプションでのソートフィールドの場所指定は、 F.C という形式で行う。ここで F は用いるフィールドの番号で、 C は先頭の文字の番号を、そのフィールドの先頭 (+POS の場合) あるいは直前のフィールドの末尾 (-POS の場合) から数えた数字である。 .C が省略された場合は、フィールドの先頭文字になる。 -b オプションが指定されると、フィールド指定の .C の部分は、 そのフィールドの空白でない最初の文字 (+POS の場合) あるいは直前のフィールドの末尾以降の空白でない最初の文字 (-POS の場合) から数えられる。

ソートキーのオプションには、 出力順序オプション (output ordering option) を含めることもでき、 その場合はグローバルな順序オプションはそのフィールドには用いられない。 -b オプションはフィールド指定の +POS-POS の どちらか片方にも、あるいは両方にも、独立に効力を及ぼすことができる。 -b がグローバルなオプションから継承されたものである場合は、 両方に影響する。キーは複数のフィールドにまたがってもかまわない。

オプション


動作モード

sort のデフォルトの動作はソート動作である。 これは以下のオプションによって変更できる。
-c 与えられたファイルがすでにソートされているかどうかをチェックする。 ソートされていないものがあった場合は、 エラーメッセージを表示してステータス 1 で終了する。 それ以外の場合は正常終了する。
-m 与えられたファイル群をまとめてソートしてマージする。 入力ファイルは事前にそれぞれソートされていなければならない。 マージ動作ではなく、ソート動作を複数ファイルにまとめて行うこともできる。 マージ動作が提供されているのは、 (これでよい場合は) こちらの方が高速だからである。
行のペアは以下のように比較される。 キーフィールドが指定されている場合は、 sort は順序オプションによって コマンドラインから指定された順に、 それぞれの行からの各フィールドを比較する。 比較動作は違いを発見するか全てのフィールドを尽くすまで継続される。

グローバルオプションの ‘-bdfinrM’ のいずれかが指定されており、 キーフィールドが一つも指定されていない場合は、 sort は行全体をグローバルオプションに従って比較する。

最後に、全てのキーが等しい (あるいは順序オプションが まったく指定されなかった) 場合には、 sort は最終手段として、行を LC_COLLATE ではなくマシンの 照合順序にしたがって 1 バイトずつ比較する。 この最終手段の比較は -r オプションに従う。 -s オプション (stable オプション) は、この最終手段比較を無効にし、 全てのフィールドの比較結果が同じだった行の順序を、入力の順序のままにする。 フィールドやグローバルオプションがまったく指定されなかった場合は、 -s オプションは無視される。

出力順序オプション

以下のオプションは、 sort が行を出力する順序に影響する。これらはグローバルにも、 あるいは特定のキーフィールドの一部としても指定できる。 キーフィールドが指定されなければ、 グローバルオプションで行全体が比較される。 キーフィールド指定がされた場合、 順序オプションが特に指定されなかったフィールドには、 グローバルオプションが継承される。
-b 各行の比較の際に、行頭の空白を無視する。
-d 「電話帳」順でソートする。 アルファベット、数字、空白以外のキャラクタをすべて無視してソートする。
-f ソートの際に、小文字を対応する大文字と同じに扱う。 例えば ‘b’ は ‘B’ と同じとみなされる。
-g strtod(3) を用いて数値に変換した後、その数値順にソートする。 これを用いると、浮動小数点の理工学的な記法 (‘1.0e-34’ や ‘10e100’ など) を扱うことができる。このオプションは、他に手段がない場合に限って用いること。 これは -n よりずっと遅いし、有効桁数が多すぎると、 丸めたかたちで比較されてしまう。 さらに、倍精度浮動小数点の範囲で扱えない数値は 0 であるかのように処理される。 またオーバーフロー・アンダーフロー・変換エラーは報告されない。
-i 印字可能でない文字を無視する。
-n 数値順に評価する。行先頭の文字列 (空白が前置されていても良い) を数値文字列として比較する。 数値文字列は、先頭の - 符号 (なくても良い)、 0 桁以上の数字、 そして小数点と 0 桁以上の数字 (なくても良い) からなる。

sort は浮動小数点表記文字列を、あまり普通でない方法で比較する。 まず各文字を C の double 方に変換してからそれらの値を比較するのではなく、 2つの文字の基数点 (radix point) を揃えて、1 文字づつ比較するのである。 この方法の利点は速度である。実際この方法は、 2つのそれぞれの文字列を double に変換してから比較するよりずっと速い (あるいは integer 変換に比べてすらずっと速い)。 また精度の問題も生じない。多くのシステムでは、 文字列を double に変換してから比較する方法では、 精度は 16 桁に制限されてしまう。 先頭の ‘+’ や指数表記は認識できない。 このような文字列を数値的に比較するには -g を用いること。

-r, --reverse
 比較の結果を逆順にする。より大きなキー値を持つ行が、 より早く現われるようになる。
-M 行頭の空白文字をすべて無視して最初に現われた 3 文字を、 月の名称の省略形とみなして ‘JAN’ < ‘FEB’ < ... < ‘DEC’ の順でソートする。 小文字は大文字と同じに扱われる。 月の名称にない文字列は、より低位であるとみなされる。

その他のオプション

+POS1[-POS2]
 ソートフィールド指定の obosolete な古い形式。行の POS1 から POS2 の直前までのフィールドを指定する。 POS2含まないPOS2 が省略されたら行末まで。 フィールドと文字位置はそれぞれ 0 から数えはじめる。
-k POS1[,POS2]
 -K POS1[,POS2] ソートフィールド指定の POSIX 形式。今後はこちらが推奨される。行の POS1 から POS2 までのフィールドを指定する。 POS2含むPOS2 が省略されたら行末まで。 フィールドと文字位置はそれぞれ 0 から数えはじめる。
-o OUTFILE
 出力先を標準出力から OUTFILE に変更する。 OUTFILE が入力ファイルのどれかひとつだった場合、 sort はその入力ファイルを一時ファイルにコピーしてから、ソートと OUTFILE への出力を行う。
-t SEPARATOR
 各行からソートキーを検索する際、文字 SEPARATOR をフィールドのセパレーターにする。 デフォルトでは、 フィールドは空白以外の文字と空白文字の間の空文字列 (empty string) によって分離される。 例えば入力行として ‘ foo bar’ が与えられた場合、 sort はこの行をフィールド ‘ foo’ と ‘ bar’ に分離する。 フィールドセパレーターは、 その前後のフィールドには含まれないものとされる。
-u デフォルトの動作と -m オプションの動作では、等しいとされた行のうちの最初のものだけを表示する。 -c オプションの動作では、 連続した行で等しいものがないかどうかをチェックする。
-z 入力における行の末尾が、<LF> (ラインフィード) ではなく <NUL> (ゼロバイト文字) で終了するとみなす。 このオプションは ‘perl -0’ や ‘find -print0’ や ‘xargs -0’ などと組み合わせて使うと便利で、 これらは任意のパス名を扱う際に信頼性を上げる効果を持つ (ラインフィード文字が含まれるパス名も正しく扱える)。
-S SIZE
 SIZE KB のバッファを使う。 単位指定文字 (後述) を用いれば、単位を変更できる。
-T TEMPDIR
 TEMPDIR を一時ファイルを置くディレクトリにする。 このオプションは環境変数 TMPDIR より優先される。-T オプションが複数回指定されると、 それぞれのディレクトリが用いられ、 巨大なソートやマージの際には性能が上がるかもしれない。
--help 標準出力に使用方法のメッセージを出力して正常終了する。
--version
 標準出力にバージョン情報を出力して正常終了する。


o 数値的に降順 (逆順) にソートする。

sort -nr

o アルファベット順にソートし、第 1・第 2 フィールドは無視する。 キーに開始フィールドとなる 3 だけを指定すれば、各行末までが比較される。

sort -k3

o 第 2 フィールドで数値的にソートし、 同じになったものを第 5 フィールドの第 3〜第 4 文字で更にソートする。 フィールドの区切りとして ‘:’ を用いる。

sort -t : -k 2,2n -k 5.3,5.4

‘-k 2,2’ の代わりに ‘-k 2’ と指定すると、 sort は第 2 フィールドから行末までの全ての文字を、 プライマリな「数値」キーとして扱ってしまう。 通常の用途では、1 つ以上のフィールドにまたがったキーを 数値的に扱うと、望む結果は得られないだろう。

‘n’ の指定が最初のキーの末尾で行われている点にも注意してほしい。 これは ‘-k 2n,2’ や ‘-k 2n,2n’ としても効果は同じである。 ‘b’ 以外の全てのオプション指定は、開始フィールドに置いても キー指定全体の末尾に置いても、指定全体に効果を及ぼす。

o パスワードファイルを第 5 フィールドでソートし、 先頭の空白文字は無視する。第 5 フィールドが同じ値を持つ行は、 第 3 フィールドのユーザー ID で数値的にソートする。

sort -t : -k 5b,5 -k 3,3n /etc/passwd

数値比較オプション -n はグローバルに用いても結果は同じ。

sort -t : -n -k 5b,5 -k 3,3 /etc/passwd

o 英大文字小文字の違いを無視してソートされた tags ファイルを生成する。

find src -type f -print0 | sort -t / -z -f | xargs -0 etags --append

この ‘-print0’, ‘-z’, ‘-0’ は、改行 (line feed) 文字を含む パス名がソート操作によって壊れないようにするためのものである。

o 最後の例。フィールドの先頭・末尾の空白群を無視するには、 第 1 キーの末尾フィールド指定もして、 ‘b’ オプションを使えばよい。

sort -t : -n -k 5b,5b -k 3,3 /etc/passwd

あるいはグローバルな指定を -n の代わりに -b にして、第 2 キーのオプションに ‘n’ を追加するかたちでもよい。

sort -t : -b -k 5,5 -k 3,3n /etc/passwd

乗数


数値の後には、倍数を指定するサイズ指定文字と、 通常のバイトを意味する B または 10 進の「商業用」バイトを意味する D を 続けて置くことができる。 たとえば ‘1KB’ は ‘1024’ と等しく、‘1KD’ は ‘1000’ と等しい。 この例外は b (512 バイト)、c (1 バイト)、 w (使うべきでない - System V では 2 を意味し、 4.2BSD では 4 を意味する) の 3 つで、 これらの後に BD をおくことはできない。

k キロ: 通常バイト指定なら 2^10 = 1024、10 進バイト指定なら 10^3 = 1000
M メガ: 2^20 = 1,048,576 または 10^6 = 1,000,000
G ギガ: 2^30 = 1,073,741,824 または 10^9 = 1,000,000,000
T テラ: 2^40 = 1,099,511,627,776 または 10^12 = 1,000,000,000,000
P ペタ: 2^50 = 1,125,899,906,842,624 または 10^15 = 1,000,000,000,000,000
E エクサ: 2^60 = 1,152,921,504,606,846,976 または 10^18 = 1,000,000,000,000,000,000
Z ゼタ: 2^70 = 1,180,591,620,717,411,303,424 または 10^21 = 1,000,000,000,000,000,000,000
Y ヨタ: 2^80 = 1,208,925,819,614,629,174,706,176 または 10^24 = 1,000,000,000,000,000,000,000,000

移植性


sort の歴史的な (BSD と System V の) 実装では、 いくつかのオプション (特に -b, -f, -n) の解釈が異なる。 POSIX に従えば、-n はもはや -b を暗黙のうちに指定することはない。 このあたりを首尾一貫させるため、 -M も同様に変更されている。 これによって、曖昧な指定では フィールド内の文字位置の指定の意味が変わってしまうかもしれない。 唯一の解決法は、 -b を明示的に指定することである。

ロケール


LC_COLLATE
 (特に他の指定がない限り) 全ての比較で用いられる 文字の照合順序を指定する。
LC_CTYPE
 -b, -d, -f, -i といった出力順序オプションの動作に影響する。
LC_NUMERIC
 基数文字と桁区切り文字 (, など) を指定する。
LC_TIME
 月名のスペルを決める。 -M に影響する。

注意


プログラムのバグについては bug-textutils@gnu.org に報告してください。 man ページは Ragnar Hojland Espinosa <ragnar@ragnar-hojland.net> が作成しました。

openSUSE Logo

コンテンツ