sort コマンド

行を並び替えができるコマンド。

foo.txt が以下の内容の場合、

$ cat foo.txt
3
44
111
11
333
33
4
4a
abc
ab
ac

sortコマンドを使うと以下のように辞書順にソートしてくれる。

$ sort foo.txt
11
111
3
33
333
4
44
4a
ab
abc
ac

-n オプションを付けると数字は数値としてソートしてくれる。数字でないものは辞書順になるみたい。

$ sort -n foo.txt
ab
abc
ac
3
4
4a
11
33
44
111
333

1つ以上のスペースで区切られた複数列のデータの場合にソートキーとなる列を指定してのソートもできる。

以下のような2列のデータがあるとして、

$ cat foo.txt
1 3
2 44
3 111
4 11
5 333
6 33
7 4
8 4a
9 abc
10 ab
11 ac

-k2 を付ければ2列目でソートできる。

$ sort -k2 foo.txt
4 11
3 111
1 3
6 33
5 333
7 4
2 44
8 4a
10 ab
9 abc
11 ac

-nk2 または -k2n とすれば2列目を数値としてソートする。

$ sort -nk2 foo.txt
10 ab
11 ac
9 abc
1 3
7 4
8 4a
4 11
6 33
2 44
3 111
5 333

$ sort -k2n foo.txt
10 ab
11 ac
9 abc
1 3
7 4
8 4a
4 11
6 33
2 44
3 111
5 333

-k2,2n -k1,1n とすると、2列目を数値としてソートして、2列目の数値が同じ場合は1列目を数値としてソートする。

$ sort -k2,2n -k1,1n foo.txt
9 abc  # <-
10 ab  # <- ここは1列目でソート
11 ac  # <-
1 3
7 4
8 4a
4 11
6 33
2 44
3 111
5 333

-k2,2n -k1,1 とすると、1列目は数値ではなく、辞書順でソートする。

$ sort -k2,2n -k1,1 foo.txt
10 ab  # <-
11 ac  # <- 10,11,9 の順に辞書順
9 abc  # <-
1 3
7 4
8 4a
4 11
6 33
2 44
3 111
5 333

-k2,2n -k1,1nr とすると、1列目は逆順にソートする。

$ sort -k2,2n -k1,1nr $p/tmp/test.txt
11 ac  # <-
10 ab  # <- 11 から 9の順にソート
9 abc  # <-
1 3
8 4a
7 4
4 11
6 33
2 44
3 111
5 333

列は1つ以上のスペースで区切られるようだが、これは -t オプションで変更できる。

ファイル名を指定しないか - とすると、標準入力を読み込んでソートする。以下の3つは同じになる。

$ sort foo.txt
$ cat foo.txt | sort
$ cat foo.txt | sort -

インストール

Coreutilsというパッケージに入っているので、CentOSにもUbuntuにも始めから入っている。

オプション

-c
すでにソートされているかどうかをチェックする。チェックのみでソートはしない。 ソートされていなければ終了コード1を返す。ソートされていれば0を返す。
--help
ヘルプ表示
-t
列の区切り文字を指定する。デフォルトはスペース。 -t, でコンマ区切りになる。 bashやzshでは -t $'\t' でタブ区切りのファイルを処理できるようになる。 Ubuntuの /bin/sh の実態はdashで、dashではこのタブの書き方ができない。
--version
バージョン表示

-- というパラメータを渡すとそれ以降のパラメータをオプションではなくファイル名とみなしてくれるので、 - で始まるファイル名を扱いたい場合に使うとよい。

ソート方法に関するオプション

-f
大文字小文字を区別しない。
-k 列番号
どの列で並び替えるかを指定する。-k 6,7 は、6列目で比較し、6列目が同じ場合は 7列目で比較する。列番号は1から始まる。-k 6 とすると、6列目で比較し、同じ場合は7列目で比較し、 また同じであれば8列目で比較し、というふうに最後の列まで順番に比較する。
-n
列のデータを数字とみなして並び替える。
-r
逆順に並び替える。
-R
ランダムな順番にソートする。

HOWTO

日本語を含むソートをするには

漢字やひらがな/カタカナなどが含まれる日本語テキストは、うまくソートできない場合があるみたいで、その場合は環境変数 LC_ALL=C または LANG=ja_JP.UTF-8 を設定するとよいみたい。

cat foo.txt | LC_ALL=C sort

uniqコマンドでも同様に、行の中に漢字やひらがな/カタカナなどが含まれるとうまくできない場合があるみたい。

LC_ALL=C を付けると処理速度が速くなる、という効果もあるみたい。

ランダムな順番にソートをするには

ランダムなのだからソートという言い方でいいのかよくわからないが。

-Rオプションを使うと、何順でもない順序に並び替わる。同じデータがある場合はそれらがバラバラにはならず、ひとまとめになる。ランダムなので実行するごとに順序は変わる。

GNU のsortコマンドであればよいが、そうでない環境では -R オプションがない場合があるみたい。

shufというコマンドもランダムに並び替えるコマンドだが、同じデータが複数あるとそれがランダムにばらばらの場所になる。

重複している数の多い順にソートするには

uniqコマンドの例を参照。

ファイルをタイムスタンプの順にソートして表示するには

参考

このサイトは筆者(hydrocul)の個人メモの集合です。すべてのページは永遠に未完成です。
スポンサーリンク