テキストファイルのソート( sort )

 テキストファイルの中身をソートするには sort コマンドが使える。オプションでどのような順序でソートするのか指定することができる  

 ※ソート:特定の規則に従ってデータを並びかえること

$ sor [ オプション ] [ ファイル名 ]

オプション

-r
逆順でソートする

-k n
n列目のデータをソートする

-n
数値としてソートする
ファイルの準備

 サンプルとなるファイルを作成する。三人の名前と数値を用いて sort コマンドとオプションの機能を確認する。

$ cat > score
yoshinori kawazu 85
keiichi oka 70
toru minemura 100
( Ctrl + c で終了する )

 ファイルを作成したので、内容を確認する

$ cat score
yoshinori kawazu 85
keiichi oka 70
toru minemura 100

 入力した内容がそのままファイルに書き込まれている。sortコマンドの機能を確認するために、このファイルをソートする。

$ sort score  
keiichi oka 70
toru minemura 100
yoshinori kawazu 85

 オプションを付けない場合は各行の1文字目のアルファベット順にソートされる( K → T → Y )。

-r オプション
$ sort -r score
yoshinori kawazu 85
toru minemura 100
keiichi oka 70

 アルファベットの逆順でソートされている( Y → T → K )。

n列目のデータソート ( -k )

 例では、1文字目を鍵としてソートを行った。これは「名前でソートしている」のと同義である。

 名前ではなく、名字でソートをしたい場合は -k オプションを利用する。 -k オプションをつけることでソートの鍵として利用する列の番号を指定することができる。

$sort -k 2 score
yoshinori kawazu 85
toru minemura 100
keiichi oka 70

 2列目のデータ(名字)を基準にソートされている( K → M → O )。

数値式でのソート

 今度は三列目の得点でソートしてみる。

$ sort -k 3 score
toru minemura 100
keiichi oka 70
yoshinori kawazu 85

 並び順がおかしくなっている。大きい順に並ぶなら 100→85→70 になるはずで、小さい順になるなら 70→85→100 になる。しかし、今回はそのどちらでもない。

 これは、3つの数値が「文字」として認識されてしまっているのが原因である。sort は1文字目しか見ないため、今回のコマンドだと3列目のデータの1文字目を基準してソートする( 1→7→8 )。

 これを辞書式ソートといい、文字を辞書に出てくる順にソートする。基準にするデータがアルファベットであれば問題ないが、得点などの数値をソートした場合には不適切である。

 これに対して数値でソートすることを数値式ソートといい、 sort に-n オプションをつけることで実行できる。

$  sort -n -k 3 score
keiichi oka 70
yoshinori kawazu 85
toru minemura 100

 特典が低い順でソートされた。

オプションに -r を加える。

$ sort -n -r -k 3 score
toru minemura 100
yoshinori kawazu 85
keiichi oka 70

-r を付与することで、得点の高い順でソートされた。(逆順でソートされた)