kuroの覚え書き

96の個人的覚え書き

複数の列でsort

excelなどでは普通に行える文字列のソート。

shellコマンドでいくつかの列を順にたどってソートするにはkオプションを使うらしい。

例えば

AT1G01000.1:139:G:A
AT1G01000.1:274:T:G
AT1G01000.1:1033:T:A
AT1G01000.1:1034:T:C
AT1G01000.1:1027:C:A
AT1G01000.1:284:C:A
AT1G01000.1:288:T:A
AT1G01000.1:1005:T:C
AT1G01000.1:1010:G:A
AT1G01000.1:1092:G:A
AT1G01000.1:141:A:G
AT1G01010.1:138:T:G
AT1G01010.1:147:A:G
AT1G01010.1:284:A:C
AT1G01010.1:314:C:T
AT1G01010.1:293:G:A
AT1G01010.1:317:G:A

このような遺伝子のSNPリストを遺伝子コード→ポジションの順でソートしたい場合、

まず行の区切りを指定するために

-t ":"

を入れる。よく一緒にパイプで繋いで使うcut では -d ":" のようになるのでややこしいが、-tだ。

次に並び順を1列目の遺伝子コードで行うため

-k 1

と入れる。
続いて2列目のポジションでソートするには

-k 2

と続けたいところだが、ここの書式は1列目のオプションと合わせて

-k 1,1 -k 2

となるらしい。
更に、そのままだとASCIIで並べ替えるので、3桁と4桁の数字が混ざっていると一番上の桁の数字からソートしてしまい、数値順にならないので

-k 1,1 -k 2n

とやることになるらしい。