フィールドを指定してソートする

スペースやタブで区切られたデータの特定のフィールドをキーにソートするには、-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列目のalphabetagammaの順に並ぶ。

なお-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】バージョン番号を考慮してソートする を参照。