sort コマンド

目的

ファイルをソートしたり、既にソートされているファイルをマージしたり、ファイルを検査してソートされているかどうかを判別します。

構文

sort [ -A ] [ -b ] [ -c ] [ -d ] [ -f ] [ -i ] [ -m ] [ -n ] [ -r ] [ -u ] [ -o OutFile ] [ -t Character ] [ -T Directory ] [ -y [ Kilobytes ] ] [ -z RecordSize ] [ [ + [ FSkip ] [ .CSkip ] [ b ] [ d ] [ f ] [ i ] [ n ] [ r ] ] [ - [ FSkip ] [ .CSkip ] [ b ] [ d ] [ f ] [ i ] [ n ] [ r ] ] ] ... [ -k KeyDefinition ] ... [ File ... ]

説明

sort コマンドは、File パラメーターで指定されたファイル内の行をソートし、その結果を標準出力へ書き出します。 File パラメーターが複数のファイルを指定する場合、sort コマンドはそれらのファイルを連結し、1 つのファイルとしてソートします。 ファイル名の代わりに - (負符号 (-)) を使用すると、標準入力が指定されます。 ファイル名を何も指定しないと、コマンドは標準入力をソートします。 出力ファイルは -o フラグで指定できます。

フラグが何も指定されないと、sort コマンドは、現行ロケールの照合順序に基づいて入力ファイルの行全体をソートします。

ソート・キー

ソート・キーは、フィールド番号と桁番号で指定された入力行の一部分です。 フィールドは、フィールド・セパレーターで区切られた入力行の一部です。 デフォルトのフィールド・セパレーターは、1 つ以上の連続するブランク文字です。 しかし、これらのブランク文字は、ソート目的では以下のフィールドの一部と見なされます。 -b オプションを指定すると、これらの先行ブランク文字を無視できます。 -t フラグを使用して、別のフィールド・セパレーターを指定することもできます。 C 言語および英語のロケールの場合は、タブおよびスペース文字がブランク文字となります。

ソート・キーを使用する場合、sort コマンドはまず、最初のソート・キーの内容に基づいてすべての行をソートします。 次に、最初のソート・キーと等しいすべての行が、2 番目のソート・キーの内容に基づいてソートされます。 このようにして次々にソートされます。ソート・キーは、コマンド・ラインに先に現れた順序で番号付けされます。 2 つの行がすべてのソート・キーに対して等しくソートされる場合、行全体が現行ロケールの照合順序に基づいて比較されます。

フィールド内で桁を番号付けする場合、デフォルトのフィールド・セパレーターのブランク文字は、後に続くフィールドの一部として数えられます。 -t フラグで指定されたフィールド・セパレーター文字は、フィールドの一部として数えられません。 -b フラグを使用すると、先行ブランク文字は無視されます。

ソート・キーは、以下の 2 つのメソッドを使用して定義できます。

  • -k KeyDefinition
  • FSkip.CSkip (古いバージョン)

-k フラグを使用したソート・キー定義

-k KeyDefinition フラグは、以下の形式を使用します。

-k [FStart [.CStart ] ] [Modifier ] [, [FEnd [.CEnd ] ][Modifier ] ]

ソート・キーは、FStart 変数で指定されたフィールドと CStart 変数で指定された桁で始まり、FEnd 変数で指定されたフィールドと CEnd 変数で指定された桁で終わるすべての文字を含みます。 Fend を指定しないと、行の最後の文字が想定されます。 CEnd を指定しないと、FEnd フィールドの最後の文字が想定されます。 KeyDefinition 変数の任意のフィールド番号または桁番号は省略できます。 デフォルト値は以下のとおりです。

項目 説明
FStart 行の最初
CStart フィールドの最初の桁
FEnd 行の最後
CEnd フィールドの最後の桁

フィールド間にスペースがあると、sort ではそれらを分離フィールドと見なします。

Modifier 変数の値は、文字 bdfinr のうちの 1 つ以上を指定できます。 修飾子は、それが付けられたフィールド定義に対してのみ適用され、同じ文字のフラグと同じ効果があります。 修飾子文字 b は、それが付けられているフィールド定義の最後にのみ適用されます。 次に例を示します。

-k 3.2b,3r

上記の例では、3 番目のフィールドの 2 番目の非ブランク桁から始まり、3 番目のフィールドの最後までのソート・キーを使用して、照合順序と逆の順序でソートするように指定されています。 FStart 変数および CStart 変数が、行の最後を超えたり FEnd 変数や CEnd 変数の後ろにある場合、ソート・キーは無視されます。

ソート・キーは同様に、以下の形式でも指定できます。

[+[FSkip1] [.CSkip1] [Modifier] ] [-[FSkip2] [.CSkip2] [Modifier]]

+FSkip1 変数は、ソート・キーの最初のフィールドに達するまでにスキップするフィールド数を指定し、+CSkip 変数は、そのフィールド内でソート・キーの最初の文字に達するまでにスキップする桁数を指定します。 -FSkip 変数は、ソート・キーの の最初の文字に達するまでにスキップするフィールド数を指定し、-CSkip 変数は、そのフィールド内でスキップする桁数を指定します。 フィールドおよび桁のスキップ数はすべて省略できます。 デフォルト値は以下のとおりです。

項目 説明
FSkip1 行の最初
CSkip1 ゼロ
FSkip2 行の最後
CSkip2 ゼロ

Modifier 変数で指定された修飾子は、-k フラグのキー・ソート定義と同じです。

+FSkip1.CSkip1 変数によって指定されるフィールド数と桁数は、それらの変数がソート・キーに達するまでにスキップするフィールド数および桁数を指定しているため、一般的には、ソート・キー自身のフィールド数および桁数よりも 1 小さい数です。 例えば、次のようにします。

+2.1b -3r

上記の例では、3 番目のフィールドの 2 番目の非ブランク桁から始まり、3 番目のフィールドの最後までのソート・キーを使用して、照合順序と逆の順序でソートするように指定されています。 ステートメント +2.1b により、2 つのフィールドをスキップし、次に先行ブランクとさらに桁を 1 つスキップするように指定されています。 +FSkip1.CSkip1 変数が、行の最後を超えたり -FSkip2.CSkip2 変数の後ろにある場合、ソート・キーは無視されます。

注: 1 行の最大フィールド数は 32 です。

フラグ

注: ソート・キー定義の前に指定されるフラグ -b-d-f-i-n、または -r は、すべてのソート・キーに適用されます。 -k KeyDefinition の後では、-b-d-f-i-n-r フラグはいずれも、単独では指定されません。これらのフラグが KeyDefinition 変数に修飾子として付けられている場合は、それが付けられているソート・キーのみに適用されます。これらのフラグのうちの 1 つが +Fskip.Cskip または -Fskip.Cskip ソート・キー定義の後ろに続く場合は、フラグはそのソート・キーにのみ適用されます。
項目 説明
-A 現行ロケール内の照合順序ではなく ASCII 照合順序を使って、バイト単位でソートします。
-b 先行スペースおよびタブを無視して、フィールドの最初または最後の桁を探します。
-c フラグ内で指定された順序規則に従って入力がソートされていることを検査します。 入力ファイルが正しくソートされていない場合は、ゼロ以外の値が戻されます。
-C フラグ内で指定された順序規則に従って入力がソートされていることを検査します。ただし、障害がある場合、または -u オプションを使用して重複キーが検出された場合に警告メッセージが標準エラーに送信されないことを除きます。
-d 辞書順でソートします。 文字、数字、スペースのみが比較の対象となります。
-f 比較する前にすべての小文字を大文字に変更します。
-i 比較するときに、非出力文字をすべて無視します。
-k KeyDefinition ソート・キーを指定します。 KeyDefinition オプションのフォーマットは以下のとおりです。

[FStart [.CStart ] ] [Modifier ] [, [FEnd [.CEnd ] ][Modifier ] ]

ソート・キーは、FStart 変数で指定されたフィールドと CStart 変数で指定された桁で始まり、FEnd 変数で指定されたフィールドと CEnd 変数で指定された桁で終わるすべての文字を含みます。 Modifier 変数の値は、bdfinr を指定できます。 修飾子は、同じ文字のフラグと同じです。 キー定義に修飾子が付加されている場合は、 フラグが適用されません。

-m 複数の入力ファイルのマージのみを実行します。 入力はソート済みであると見なされます。
-n 算術値を使って数値フィールドをソートします。 数値フィールドには、先行ブランク、オプションの負符号 (-)、10 進数、千の位取り記号、オプションの基数文字を含みます。 非数字を含むフィールドの数値ソートを実行すると、予想できない結果が起こる可能性があります。
-o OutFile 標準出力の代わりに OutFile パラメーターで指定されたファイルへ出力を指示します。 OutFile パラメーターの値は、File パラメーターと同じです。
-r 指定されたソートの順位を反転します。
-t Character Character を 1 つのフィールド・セパレーター文字として指定します。
-u ソート・キーとオプションに従って等価としてソートされる行の各セットの、最初の行以外をすべて抑制します。
-T Directory 作成された一時ファイルのすべてを、Directory パラメーターで指定されたディレクトリーに入れます。
-y[Kilobytes] Kilobytes パラメーターで指定されたキロバイト数の主記憶域を使って sort コマンドを始動し、必要に応じてストレージを追加します (Kilobytes パラメーターで指定された値が最小ストレージ・サイズより小さい場合、または最大ストレージ・サイズより大きい場合は、それぞれ最小値または最大値が使用されます)。-y フラグが省略されると、 sort コマンドはデフォルトのストレージ・サイズを使って始動されます。 -y0 フラグの場合は最小ストレージで始動され、-y フラグ (Kilobytes 値なし) の場合は最大ストレージで始動されます。 sort コマンドが使用するストレージの大きさは、パフォーマンスに大きく影響します。 大容量ストレージ内で小規模ファイルをソートすると、無駄が多くなります。
-z RecordSize ソート中のいずれかの行がデフォルトのバッファー・サイズより長い場合に、異常終了するのを防ぎます。 デフォルトのバッファー・サイズは 20 KB です。 -c または -m フラグを指定すると、ソート・フェーズは省略され、システムのデフォルト・バッファー・サイズが使用されます。 ソートした行がデフォルトのサイズより長くなると、sort コマンドは異常終了します。 -z オプションは当該のソート・フェーズにおける最長行を記録するように指定するため、適当なバッファーをマージ・フェーズに割り当てることができます。 RecordSize 変数には、マージする最長行と同じかそれ以上のバイト値を指定しなければなりません。 C ロケールでサポートされる最長行サイズは約 2M 文字で、C 以外のロケールでサポートされる最長行サイズは 1M 文字です。 -z オプションは、C ロケールでは効果がありません。

終了状況

このコマンドは、以下の終了値を戻します。

項目 説明
0 すべての入力ファイルが正常に出力されたか、または -c が指定され、入力ファイルが正しくソートされました。
1 -c オプションに基づいて、ファイルの順序が指定したとおりにならなかったか、または -c および -u オプションの両方を指定した場合に、2 つの入力行に同じキーが付いているのが見つかりました。
>1 エラーが発生しました。

  1. LC_ALLLC_COLLATELANG 環境変数を En_US に設定して fruits ファイルのソートを実行するには、以下のように入力します。
    LANG=En_US sort fruits
    このコマンド・シーケンスによって、fruits ファイルの内容が辞書の昇順で表示されます。 スペース、数字、特殊文字を含めた各桁の文字が 1 つずつ比較されます。 例えば、fruits ファイルに以下のようなテキストが含まれている場合、
    banana
    orange
    Persimmon
    apple
    %%banana
    apple
    ORANGE
    sort コマンドは以下のように表示します。
    %%banana
    ORANGE
    Persimmon
    apple
    apple
    banana
    orange
    ASCII 照合順序では、英大文字は英小文字より先に、% (パーセント記号) は英大文字より先になります。 現行ロケールが ASCII 以外の文字セットを使用している場合は、結果が異なることもあります。
  2. 辞書順でソートするには、以下のように入力します。
    sort  -d fruits
    このコマンド・シーケンスによって、文字、数字、スペースだけを比較して fruits ファイルの内容がソートされて表示されます。 fruits ファイルが例 1 と同じ場合は、sort コマンドは以下のように表示されます。
    ORANGE
    Persimmon
    apple
    apple
    %%banana
    banana
    orange
    -d フラグは、% (パーセント記号) を文字、数字、スペースのいずれでもないので無視し、%%bananabanana を並べます。
  3. 英大文字および特殊文字を含む行を同様の英小文字と一緒にグループ化するには、以下のように入力します。
    sort  -d -f fruits
    -d フラグは特殊文字を無視し、-f フラグは大文字と小文字の違いを無視します。 LC_ALLLC_COLLATELANG 環境変数を C に設定すると、 fruits ファイルの出力は以下のように表示されます。
    apple
    apple
    %%banana
    banana
    ORANGE
    orange
    Persimmon
  4. 重複行を除去してソートするには、以下のように入力します。
    sort  -d  -f  -u fruits
    -u フラグは sort コマンドに対して、 重複行を除去してファイルの各行を固有にするように指示します。 このコマンド・シーケンスにより、以下のように表示されます。
    apple
    %%banana
    ORANGE
    Persimmon
    重複する apple だけでなく、 bananaORANGE も除去されます。 これは -d フラグが %% 特殊文字を無視し、-f フラグが大文字と小文字の違いを無視するためです。
  5. 例 4 と同様にソートし、大文字化や句読点の位置の違いは別にして重複行を除去するには、以下のように入力します。
    sort  -u +0  -d -f +0 fruits
    +0 -d -f と入力すると、 例 3 の -d -f で行われる場合と同じタイプのソートが行われます。 この場合、+0 では、同一でない行を区別するための別の比較が行われます。 これによって -u フラグがこれらの重複を除去しないようにします。

    例 1 に示された fruits ファイルを使った場合、 付加された +0 によって %%bananabanana が区別され、 また ORANGEorange が区別されます。 ただし、apple の 2 つのインスタンスはまったく同一なので、片方が削除されます。

    apple
    %%banana
    banana
    ORANGE
    orange
    Persimmon
  6. フィールドを区切る文字を指定するには、以下のように入力します。
    sort  -t: +1 vegetables
    このコマンド・シーケンスによって、vegetables ファイルがソートされ、各行の最初のコロンに続くテキストが比較されます。 +1 sort コマンドに対して、 最初のフィールドを無視し、2 番目のフィールドの最初から行の終わりまでを比較することを指示します。 -t: フラグは sort コマンドに対して、フィールドがコロンで区切られることを指示します。 vegetables に以下の内容が含まれている場合は次のようになります。
    yams:104
    turnips:8
    potatoes:15
    carrots:104
    green beans:32
    radishes:5
    lettuce:15
    LC_ALLLC_COLLATELANG 環境変数を C に設定すると、sort コマンドは以下のように表示します。
    carrots:104
    yams:104
    lettuce:15
    potatoes:15
    green beans:32
    radishes:5
    turnips:8
    数字は数値順になっていないことに注意してください。 これは辞書順によるソートが各文字を左から右へ比較するために起こります。 言いかえれば、35 の前に来るので、 325 の前に来ます。
  7. 数字をソートするには、以下のように入力します。
    sort  -t: +1  -n vegetables
    このコマンド・シーケンスによって、vegetables ファイルは 2 番目のフィールドの数値によってソートされます。 vegetables ファイルの内容が例 6 と同じ場合は、 sort コマンドは以下のように表示します。
    radishes:5
    turnips:8
    lettuce:15
    potatoes:15
    green beans:32
    carrots:104
    yams:104
  8. 複数のフィールドについてソートを行うには、以下のように入力します。
    sort  -t: +1 -2  -n +0 -1  -r vegetables
    または
    sort  -t:  -k2,2 n -k1,1 r vegetables
    このコマンド・シーケンスは、2 番目のフィールドで数値ソートを実行します (+1 -2 -n)。 同じ範囲で、最初のフィールドがアルファベットの逆順にソートされます (+0 -1 -r)。 LC_ALLLC_COLLATELANG 環境変数を C に設定すると、出力は以下のようになります。
    radishes:5
    turnips:8
    potatoes:15
    lettuce:15
    green beans:32
    yams:104
    carrots:104
    このコマンドは行を数値順でソートします。 2 つの行に同じ数値が含まれている場合は、アルファベットの逆順に表示されます。
  9. 元のファイルをソートされたテキストと置き換えるには、以下のように入力します。
    sort  -o vegetables vegetables
    このコマンド・シーケンスによって、 ソートされた出力が vegetables ファイル内に保管されます (-o vegetables)。

ファイル

項目 説明
/usr/bin/sort sort コマンドが入っています。
項目 説明
/var/tmp sort コマンドの処理中の一時スペースです。
/usr/tmp ファイルを /var/tmp で作成できない場合の、sort コマンドの処理中の一時スペースになります。
/tmp ファイルを /var/tmp または /usr/tmp で作成できない場合の、sort コマンドの処理中の一時スペースになります。