フィールドを指定してソートする
スペースやタブで区切られたデータの特定のフィールドをキーにソートするには、-k(--key)オプションを使用する。
$ cat data.txt
banana 3 100
apple 10 20
cherry 1 300
apple 2 50
$ sort -k2 data.txt
cherry 1 300
apple 10 20
apple 2 50
banana 3 100
-k2は2列目以降を文字列としてソートする。数値としてソートしたい場合はnを付けて-k2nとする。
$ sort -k2n data.txt
cherry 1 300
apple 2 50
banana 3 100
apple 10 20
ソート対象のフィールドを1列に限定する
-k2は2列目から行末までを比較対象とする。2列目のみを比較対象としたい場合は-k2,2のように開始位置と終了位置を指定する。
2列目の値が重複する場合、両者の違いが表れる。
$ cat data2.txt
beta 5 300
alpha 5 100
gamma 5 200
$ sort -k2 data2.txt
alpha 5 100
gamma 5 200
beta 5 300
-k2は2列目から行末までの文字列(5 300など)を比較するため、2列目が同じ5でも3列目の値によって順序が決まる。
$ sort -k2,2 data2.txt
alpha 5 100
beta 5 300
gamma 5 200
-k2,2で2列目のみに限定すると、2列目の値がすべて5で並ぶため比較結果は同点になる。同点の行はsortのデフォルトの挙動により行全体の文字列順で決着し、1列目のalpha、beta、gammaの順に並ぶ。
なお-k2nと-k2,2nのように数値としてソートする場合は、範囲を広げても2列目の数値部分だけが比較に使われるため、両者の結果は常に同じになる。
複数のキーでソートする
-kオプションは複数回指定できる。1列目を文字列、2列目を数値でソートするには以下のようにする。
$ sort -k1,1 -k2,2n data.txt
apple 2 50
apple 10 20
banana 3 100
cherry 1 300
1列目が同じappleの行は2列目の数値順に並び、それ以外は1列目の文字列順に並ぶ。
区切り文字を指定する
デフォルトではフィールドの区切り文字は空白文字だが、-tオプションで任意の区切り文字を指定できる。CSVファイルをカンマ区切りで扱うには以下のようにする。
$ cat csv.txt
suzuki,30,tokyo
tanaka,25,osaka
sato,40,nagoya
$ sort -t, -k2n csv.txt
tanaka,25,osaka
suzuki,30,tokyo
sato,40,nagoya
補足
-kオプションで指定するフィールド番号は1始まりである。詳細はsort(1) - Linux manual page
を参照。
human readableな数値のソートについてはsortコマンドでhuman readableな数値をソートする を参照。バージョン番号のソートについては【sort -V】バージョン番号を考慮してソートする を参照。
