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

sort

sortコマンドは、ファイルのソートを行うことができます。
sortコマンドは、基本的に文字コード順で文字を比較しますが、オプションを用いることで、数値の比較等をすることができます。
また、sortコマンドは、オプションを用いてキーを指定することで、より複雑なソートも行うことができます。

sortコマンドとは

sortコマンドは、ファイルをソートすることができます。
また、複数のファイルの内容を一つのファイルにしながらソートするマージソートの機能やソート済みのファイルかどうかをチェックする機能もあります。

いくつかのLinuxコマンドは、ソート済みファイルが条件となっている場合があります。
sortコマンドは、その前準備に用いることができます。

sortコマンドで意図したソート結果にならない場合は、--debugオプションを用いて、どのキーをソートしているかを確認することもできます。

sortコマンドの構文

ファイルをソートする

sortコマンドの利用例

ファイルをソート
(オプションなし)

オプションなしのソートは、それぞれの行全体を見て、最初の文字から順に昇順にソートします。

コマンド例

randdata.txt

実行結果

大文字と小文字を同等として比較
(-fオプション)

-fオプションは、ソートをするときにアルファベットの大文字と小文字を同等として比較します。

大文字と小文字は同等として比較しますが、その順序は大文字が初めに来るようにソートされます。
また、-uオプションを用いると小文字のほうが削除されます。

コマンド例

randdata2.txt

実行結果

倍精度数値で比較
(-gオプション)

-gオプションは、数値を倍精度数値として扱い、ソートを行うことができます。

コマンド例

randdata3.txt

実行結果

eまたはEがつく数値は指数を用いた数値表現です。
1e+1は10を表し、1e+2は100を表します。
1e-1は0.1を表し、1e-2は0.01を表します。

SIの接頭辞で比較
(-hオプション)

-hオプションは、初めに数値でソートして、その後、SIの接頭辞(なし, Kかk, M, G, T, P, E, Z, Y)でソートを行います。
SIの接頭辞でソートを行うため、例えば、9999M等は1Gの手前になるようにソートされます。
コマンド例

randdata4.txt

実行結果

数値を比較
(-nオプション)

-nオプションを用いることで、数値を比較することができます。
環境によりますが、3桁ごとの桁区切りに,(カンマ)を用いることができます。
-nオプションでは、-gオプションのように指数表現を用いることはできません。

コマンド例

randdata5.txt

実行結果

キーを選択して比較
(-kオプション)

-kオプションは、始点のポジションと終端のポジションを指定して、その範囲の文字列に対してソートを行うことができます。

-kオプションは、-k2,2のように指定できます。
-kオプションの書式はf[.c][opts]になります。
fは列、cは文字の位置です。
cが省略される場合、始点の場合は1に、終端の場合は0になります。
optsはsortコマンドのソートオプションになり、そのキーに対してソートオプションを用いることができます。

-k2,2-k2.1,2.0の省略になります。
文字位置の1は、1文字目を表します。
ただし、終端ポジションの文字位置の0は、その列の終端を表します。

-k2のように、終端のポジションが省略された場合、始点から行末までの範囲の文字列で比較を行います。
ソートする範囲は、--debugオプションを用いて確認することもできます。

コマンド例は、2列目を降順でソートしています。

コマンド例

randdata6.txt

実行結果

区切り文字を変更
(-tオプション)

-tオプションを用いることで、区切り文字を変更することができます。
区切り文字は一つの文字を指定します。

コマンド例

randdata7.txt

実行結果

last-resort comparisonを無効
(-kオプションと-sオプション)

-kオプションを用いるときでも、sortコマンドは暗黙的に行全体のソートをしています。
sortコマンドのこの機能をlast-resort comparisonといいます。
この機能によって、ときどき意図しないソート結果になるかもしれません。
-sオプションを用いることでこの機能を無効にすることができます。

コマンド例

randdata8.txt

実行結果

-sオプションを用いない場合は以下のようになります。
コマンド例

実行結果

マージソート
(-mオプション)

-mオプションは、それぞれのファイルがソート済みのときに利用することができます。
それぞれのデータを合わせて、一つのソート済みデータを作成することができます。

コマンド例

sortedfile.txt

sortedfile2.txt

sortedfile3.txt

実行結果

ソートされているかどうかをチェック
(-cオプション)

-cオプションは、ファイルがソート済みかどうかをチェックすることができます。
ソートされている場合は終了ステータスに0を返します。
ソートされていない場合は終了ステータスに1を返し、メッセージを出力します。

ソート済みの場合

コマンド例

sortedfile.txt

実行結果(終了ステータス)

ソートされていない場合

コマンド例

randdata.txt

実行結果

実行結果(終了ステータス)

終了ステータスは以下のコマンドで確認できます。
コマンド例

ソートされているかどうかをチェック
(-Cオプション)

-Cオプションは、ファイルがソート済みかどうかをチェックすることができます。
ソートされている場合は終了ステータスに0を返します。
ソートされていない場合は終了ステータスに1を返します。
-cオプションと違い、メッセージを出力しません。

コマンド例

randdata.txt

実行結果(終了ステータス)

sortコマンドのデバックオプション
(--debugオプション)

--debugオプションはどこをソートのキーにしているかを表示することができます。
ソートのキーはアンダーバーで表示されます。

コマンド例

randdata6.txt

実行結果

-sオプションでlast-resort comparisonを無効にすると2番目の全体にかかるアンダーバーが消えます。
コマンド例

実行結果
-bオプションを用いると、ソートキーの最初の空白を無視することができます。
コマンド例

実行結果

バージョン順にソート
(-Vオプション)

-Vオプションはバージョン順にソートすることができます。
また、ソートする際に、数字部分の0から始まる部分は無視されるので5は003より後に表示されます。

コマンド例

randdata9.txt

実行結果

ソート結果を逆にする
(-rオプション)

-rオプションは、sortコマンドの実行結果を逆順にすることができます。

コマンド例

randdata.txt

実行結果

ランダムソート
(-Rオプション)

-Rオプションは、ファイルの内容のソートキーをハッシュ値にして、そのハッシュ値をランダムに取り出すことで、ファイルの内容をランダムに並び替えることができます。
よく似た機能にshufコマンドがあります。sortコマンドの-Rオプションとshufコマンドの違いは、同じ値のものを並び替えるときに現れます。
sortコマンドの-Rオプションの場合、ハッシュ値を用いるため、同じソートキーのものは連続して表示されます。一方で、shufコマンドの場合はそのようなことはありません。

コマンド例

randdata11.txt

実行結果

shufコマンドの場合は以下のようになります。
コマンド例

実行結果

出力ファイルを指定
(-oオプション)

-oオプションは、ソートする対象ファイルと同じファイルに上書きするような場合に使います。

コマンド例

randdata.txt

実行結果(randdata.txt)

参考

外部リンクGnu Coreutils

外部リンクGnu Coreutils日本語版