行を並び替えができるコマンド。
foo.txt
が以下の内容の場合、
$ cat foo.txt344111113333344aabcabac
sort
コマンドを使うと以下のように辞書順にソートしてくれる。
$ sort foo.txt111113333334444aababcac
-n
オプションを付けると数字は数値としてソートしてくれる。数字でないものは辞書順になるみたい。
$ sort -n foo.txtababcac344a113344111333
1つ以上のスペースで区切られた複数列のデータの場合にソートキーとなる列を指定してのソートもできる。
以下のような2列のデータがあるとして、
$ cat foo.txt1 32 443 1114 115 3336 337 48 4a9 abc10 ab11 ac
-k2
を付ければ2列目でソートできる。
$ sort -k2 foo.txt4 113 1111 36 335 3337 42 448 4a10 ab9 abc11 ac
-nk2
または-k2n
とすれば2列目を数値としてソートする。
$ sort -nk2 foo.txt10 ab11 ac9 abc1 37 48 4a4 116 332 443 1115 333$ sort -k2n foo.txt10 ab11 ac9 abc1 37 48 4a4 116 332 443 1115 333
-k2,2n -k1,1n
とすると、2列目を数値としてソートして、2列目の数値が同じ場合は1列目を数値としてソートする。
$ sort -k2,2n -k1,1n foo.txt9 abc # <-10 ab # <- ここは1列目でソート11 ac # <-1 37 48 4a4 116 332 443 1115 333
-k2,2n -k1,1
とすると、1列目は数値ではなく、辞書順でソートする。
$ sort -k2,2n -k1,1 foo.txt10 ab # <-11 ac # <- 10,11,9 の順に辞書順9 abc # <-1 37 48 4a4 116 332 443 1115 333
-k2,2n -k1,1nr
とすると、1列目は逆順にソートする。
$ sort -k2,2n -k1,1nr $p/tmp/test.txt11 ac # <-10 ab # <- 11 から 9の順にソート9 abc # <-1 38 4a7 44 116 332 443 1115 333
列は1つ以上のスペースで区切られるようだが、これは-t
オプションで変更できる。
ファイル名を指定しないか-
とすると、標準入力を読み込んでソートする。以下の3つは同じになる。
$ sort foo.txt$ cat foo.txt | sort$ cat foo.txt | sort -
Coreutilsというパッケージに入っているので、CentOSにもUbuntuにも始めから入っている。
-c
--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
漢字やひらがな/カタカナなどが含まれる日本語テキストは、うまくソートできない場合があるみたいで、その場合は環境変数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
コマンドの例を参照。
参考