sortコマンドは、ファイルのソートを行うことができます。
sortコマンドは、基本的に文字コード順で文字を比較しますが、オプションを用いることで、数値の比較等をすることができます。
また、sortコマンドは、オプションを用いてキーを指定することで、より複雑なソートも行うことができます。
目次
- 1 sortコマンドとは
- 2 sortコマンドの構文
- 3 sortコマンドの利用例
- 3.1 ファイルをソート (オプションなし)
- 3.2 大文字と小文字を同等として比較 (-fオプション)
- 3.3 倍精度数値で比較 (-gオプション)
- 3.4 SIの接頭辞で比較 (-hオプション)
- 3.5 数値を比較 (-nオプション)
- 3.6 キーを選択して比較 (-kオプション)
- 3.7 区切り文字を変更 (-tオプション)
- 3.8 last-resort comparisonを無効 (-kオプションと-sオプション)
- 3.9 マージソート (-mオプション)
- 3.10 ソートされているかどうかをチェック (-cオプション)
- 3.11 ソートされているかどうかをチェック (-Cオプション)
- 3.12 sortコマンドのデバックオプション (--debugオプション)
- 3.13 バージョン順にソート (-Vオプション)
- 3.14 ソート結果を逆にする (-rオプション)
- 3.15 ランダムソート (-Rオプション)
- 3.16 出力ファイルを指定 (-oオプション)
- 4 参考
sortコマンドとは
sortコマンドは、ファイルをソートすることができます。
また、複数のファイルの内容を一つのファイルにしながらソートするマージソートの機能やソート済みのファイルかどうかをチェックする機能もあります。
いくつかのLinuxコマンドは、ソート済みファイルが条件となっている場合があります。
sortコマンドは、その前準備に用いることができます。
sortコマンドで意図したソート結果にならない場合は、--debugオプションを用いて、どのキーをソートしているかを確認することもできます。
sortコマンドの構文
ファイルをソートする
1 |
sort [option]... [file]... |
sortコマンドの利用例
ファイルをソート
(オプションなし)
オプションなしのソートは、それぞれの行全体を見て、最初の文字から順に昇順にソートします。
コマンド例
1 |
sort randdata.txt |
randdata.txt
1 2 3 4 5 6 7 8 9 |
4 3 6 5 1 7 8 2 9 |
実行結果
1 2 3 4 5 6 7 8 9 |
1 2 3 4 5 6 7 8 9 |
大文字と小文字を同等として比較
(-fオプション)
-fオプションは、ソートをするときにアルファベットの大文字と小文字を同等として比較します。
大文字と小文字は同等として比較しますが、その順序は大文字が初めに来るようにソートされます。
また、-uオプションを用いると小文字のほうが削除されます。
コマンド例
1 |
sort -f randdata2.txt |
randdata2.txt
1 2 3 4 5 6 |
b B a A C c |
実行結果
1 2 3 4 5 6 |
A a B b C c |
倍精度数値で比較
(-gオプション)
-gオプションは、数値を倍精度数値として扱い、ソートを行うことができます。
コマンド例
1 |
sort -g randdata3.txt |
randdata3.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
6 5 11 13 15 10.5 12 9 8 0.656e+1 6.32 6.2 10 14 7 0.789E+1 |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
5 6 6.2 6.32 0.656e+1 7 0.789E+1 8 9 10 10.5 11 12 13 14 15 |
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の手前になるようにソートされます。
コマンド例
1 |
sort -h randdata4.txt |
randdata4.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
0.4k 1T 1M 10000 1K 4 1E 60 2k 1001 1k 1Z 9999M 0.00001M 1G 2K 1Y 1P |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
4 60 1001 10000 0.4k 1K 1k 2K 2k 0.00001M 1M 9999M 1G 1T 1P 1E 1Z 1Y |
数値を比較
(-nオプション)
-nオプションを用いることで、数値を比較することができます。
環境によりますが、3桁ごとの桁区切りに,(カンマ)を用いることができます。
-nオプションでは、-gオプションのように指数表現を用いることはできません。
コマンド例
1 |
sort -n randdata5.txt |
randdata5.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
10,000,000 10.5 99 15 12 1,000 11 6.32 10 0.656e+1 0.789E+1 -10 6.2 9 5 13 8 1010 7 6 14 20000000 |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
-10 0.656e+1 0.789E+1 5 6 6.2 6.32 7 8 9 10 10.5 11 12 13 14 15 99 1,000 1010 10,000,000 20000000 |
キーを選択して比較
(-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列目を降順でソートしています。
コマンド例
1 |
sort -k2,2r randdata6.txt |
randdata6.txt
1 2 3 4 |
a 3 apple a 4 melon a 1 apple a 2 melon |
実行結果
1 2 3 4 |
a 4 melon a 3 apple a 2 melon a 1 apple |
区切り文字を変更
(-tオプション)
-tオプションを用いることで、区切り文字を変更することができます。
区切り文字は一つの文字を指定します。
コマンド例
1 |
sort -t":" -k2,2 randdata7.txt |
randdata7.txt
1 2 3 4 |
a:3:apple a:4:melon a:1:apple a:2:melon |
実行結果
1 2 3 4 |
a:1:apple a:2:melon a:3:apple a:4:melon |
last-resort comparisonを無効
(-kオプションと-sオプション)
-kオプションを用いるときでも、sortコマンドは暗黙的に行全体のソートをしています。
sortコマンドのこの機能をlast-resort comparisonといいます。
この機能によって、ときどき意図しないソート結果になるかもしれません。
-sオプションを用いることでこの機能を無効にすることができます。
コマンド例
1 |
sort -s -k2,2 randdata8.txt |
randdata8.txt
1 2 3 4 |
D 2 A 2 C 2 B 2 |
実行結果
1 2 3 4 |
D 2 A 2 C 2 B 2 |
コマンド例
1 |
sort -k2,2 randdata8.txt |
実行結果
1 2 3 4 |
A 2 B 2 C 2 D 2 |
マージソート
(-mオプション)
-mオプションは、それぞれのファイルがソート済みのときに利用することができます。
それぞれのデータを合わせて、一つのソート済みデータを作成することができます。
コマンド例
1 |
sort -m sortedfile.txt sortedfile2.txt sortedfile3.txt |
sortedfile.txt
1 2 3 4 5 6 7 8 9 |
1 2 3 4 5 6 7 8 9 |
sortedfile2.txt
1 2 3 4 |
2 4 7 9 |
sortedfile3.txt
1 2 3 |
3 6 9 |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
1 2 2 3 3 4 4 5 6 6 7 7 8 9 9 9 |
ソートされているかどうかをチェック
(-cオプション)
-cオプションは、ファイルがソート済みかどうかをチェックすることができます。
ソートされている場合は終了ステータスに0を返します。
ソートされていない場合は終了ステータスに1を返し、メッセージを出力します。
ソート済みの場合
コマンド例
1 |
sort -c sortedfile.txt |
sortedfile.txt
1 2 3 4 5 6 7 8 9 |
1 2 3 4 5 6 7 8 9 |
実行結果(終了ステータス)
1 |
0 |
ソートされていない場合
コマンド例
1 |
sort -c randdata.txt |
randdata.txt
1 2 3 4 5 6 7 8 9 |
4 3 6 5 1 7 8 2 9 |
実行結果
1 |
sort: randdata.txt:2: 順序が不規則: 3 |
実行結果(終了ステータス)
1 |
1 |
コマンド例
1 |
echo $? |
ソートされているかどうかをチェック
(-Cオプション)
-Cオプションは、ファイルがソート済みかどうかをチェックすることができます。
ソートされている場合は終了ステータスに0を返します。
ソートされていない場合は終了ステータスに1を返します。
-cオプションと違い、メッセージを出力しません。
コマンド例
1 |
sort -C randdata.txt |
randdata.txt
1 2 3 4 5 6 7 8 9 |
4 3 6 5 1 7 8 2 9 |
実行結果(終了ステータス)
1 |
1 |
sortコマンドのデバックオプション
(--debugオプション)
--debugオプションはどこをソートのキーにしているかを表示することができます。
ソートのキーはアンダーバーで表示されます。
コマンド例
1 |
sort -k3,3 --debug randdata6.txt |
randdata6.txt
1 2 3 4 |
a 3 apple a 4 melon a 1 apple a 2 melon |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
sort: `ja_JP.UTF-8' ソートルールを使用しています sort: leading blanks are significant in key 1; consider also specifying 'b' a 1 apple ______ _________ a 3 apple ______ _________ a 2 melon ______ _________ a 4 melon ______ _________ |
コマンド例
1 |
sort -k3,3 -s --debug randdata6.txt |
実行結果
1 2 3 4 5 6 7 8 9 10 |
sort: `ja_JP.UTF-8' ソートルールを使用しています sort: leading blanks are significant in key 1; consider also specifying 'b' a 3 apple ______ a 1 apple ______ a 4 melon ______ a 2 melon ______ |
コマンド例
1 |
sort -k3,3 -b --debug randdata6.txt |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 |
sort: `ja_JP.UTF-8' ソートルールを使用しています a 1 apple _____ _________ a 3 apple _____ _________ a 2 melon _____ _________ a 4 melon _____ _________ |
バージョン順にソート
(-Vオプション)
-Vオプションはバージョン順にソートすることができます。
また、ソートする際に、数字部分の0から始まる部分は無視されるので5は003より後に表示されます。
コマンド例
1 |
sort -V randdata9.txt |
randdata9.txt
1 2 3 4 5 6 7 8 |
ver12 ver2 ver007 ver003 ver1.2 ver10 ver5 ver1 |
実行結果
1 2 3 4 5 6 7 8 |
ver1 ver1.2 ver2 ver003 ver5 ver007 ver10 ver12 |
ソート結果を逆にする
(-rオプション)
-rオプションは、sortコマンドの実行結果を逆順にすることができます。
コマンド例
1 |
sort -r randdata.txt |
randdata.txt
1 2 3 4 5 6 7 8 9 |
4 3 6 5 1 7 8 2 9 |
実行結果
1 2 3 4 5 6 7 8 9 |
9 8 7 6 5 4 3 2 1 |
ランダムソート
(-Rオプション)
-Rオプションは、ファイルの内容のソートキーをハッシュ値にして、そのハッシュ値をランダムに取り出すことで、ファイルの内容をランダムに並び替えることができます。
よく似た機能にshufコマンドがあります。sortコマンドの-Rオプションとshufコマンドの違いは、同じ値のものを並び替えるときに現れます。
sortコマンドの-Rオプションの場合、ハッシュ値を用いるため、同じソートキーのものは連続して表示されます。一方で、shufコマンドの場合はそのようなことはありません。
コマンド例
1 |
sort -R randdata11.txt |
randdata11.txt
1 2 3 4 5 6 7 8 9 10 11 12 13 |
3 2 6 9 7 7 1 5 2 3 7 4 8 |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 |
5 2 2 1 6 7 7 7 8 3 3 9 4 |
コマンド例
1 |
shuf randdata11.txt |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 |
7 4 2 8 7 1 3 3 2 6 7 9 5 |
出力ファイルを指定
(-oオプション)
-oオプションは、ソートする対象ファイルと同じファイルに上書きするような場合に使います。
コマンド例
1 |
sort -o randdata.txt randdata.txt |
randdata.txt
1 2 3 4 5 6 7 8 9 |
4 3 6 5 1 7 8 2 9 |
実行結果(randdata.txt)
1 2 3 4 5 6 7 8 9 |
1 2 3 4 5 6 7 8 9 |
参考
外部リンクGnu Coreutils
外部リンクGnu Coreutils日本語版