sort コマンド 2016/10/11
行を並び替えができるコマンド。
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 -
インストール 2016/03/17
Coreutilsというパッケージに入っているので、CentOSにもUbuntuにも始めから入っている。
オプション 2016/06/24
-c
- すでにソートされているかどうかをチェックする。チェックのみでソートはしない。 ソートされていなければ終了コード1を返す。ソートされていれば0を返す。
--help
- ヘルプ表示
-t
- 列の区切り文字を指定する。デフォルトはスペース。
-t,
でコンマ区切りになる。 bashやzshでは-t $'\t'
でタブ区切りのファイルを処理できるようになる。 Ubuntuの/bin/sh
の実態はdashで、dashではこのタブの書き方ができない。 --version
- バージョン表示
--
というパラメータを渡すとそれ以降のパラメータをオプションではなくファイル名とみなしてくれるので、
-
で始まるファイル名を扱いたい場合に使うとよい。
ソート方法に関するオプション 2015/09/26
-f
- 大文字小文字を区別しない。
-k
列番号- どの列で並び替えるかを指定する。
-k 6,7
は、6列目で比較し、6列目が同じ場合は 7列目で比較する。列番号は1から始まる。-k 6
とすると、6列目で比較し、同じ場合は7列目で比較し、 また同じであれば8列目で比較し、というふうに最後の列まで順番に比較する。 -n
- 列のデータを数字とみなして並び替える。
-r
- 逆順に並び替える。
-R
- ランダムな順番にソートする。
HOWTO
日本語を含むソートをするには 2014/11/19
漢字やひらがな/カタカナなどが含まれる日本語テキストは、うまくソートできない場合があるみたいで、その場合は環境変数 LC_ALL=C
または LANG=ja_JP.UTF-8
を設定するとよいみたい。
例
cat foo.txt | LC_ALL=C sort
uniq
コマンドでも同様に、行の中に漢字やひらがな/カタカナなどが含まれるとうまくできない場合があるみたい。
LC_ALL=C
を付けると処理速度が速くなる、という効果もあるみたい。
ランダムな順番にソートをするには 2017/01/16
ランダムなのだからソートという言い方でいいのかよくわからないが。
-R
オプションを使うと、何順でもない順序に並び替わる。同じデータがある場合はそれらがバラバラにはならず、ひとまとめになる。ランダムなので実行するごとに順序は変わる。
GNU のsort
コマンドであればよいが、そうでない環境では -R
オプションがない場合があるみたい。
shuf
というコマンドもランダムに並び替えるコマンドだが、同じデータが複数あるとそれがランダムにばらばらの場所になる。
重複している数の多い順にソートするには 2014/11/14
uniq
コマンドの例を参照。
ファイルをタイムスタンプの順にソートして表示するには 2015/04/01
参考