タイトルのママですが、headerを残して、その他の行をsortしたい場合はよくあると思います。NGS解析では、bedファイルやsamファイルでしょうか。headerファイルを別のファイルに分けておいて、ソートしたファイルに、後から足すなどすればすむ話ですが是非ワンライナーでやりたいとおもいました。
データ
test.bed
Chr Start End ID Score Strand
chrM 13676 13771 SRR891268.4 42 +
chr17 25777774 25777825 SRR891268.7 40 -
chrM 6370 6436 SRR891268.28 42 +
chr6 120122843 120122904 SRR891268.38 42 +
chr4 109520697 109520774 SRR891268.51 42 +
chr17 4046420 4046472 SRR891268.52 42 -
chrM 12742 12824 SRR891268.56 25 +
chrM 10183 10234 SRR891268.58 42 +
chr18 57454680 57454760 SRR891268.62 42 +
chrM 9780 9838 SRR891268.72 25 +
テクニック
(): 括弧内のコマンド実行を別プロセスで行う。今回はこれを利用して、&&で結んだ2つの実行結果をパイプで食わせる
-n: head, tailのオプションで出力情報を上からもしくは下からの行数で指定できる。 -1を加えるとheadの場合は最後の行を省く。tailの場合は、最後の行だけが表示される(headの場合と反対になるので注意)。
この2つを使うとsortが実現できる。
(head -n +1 test.bed && tail -n +2 test.bed | sort -k1,1 -k2,2n) > test.sort.bed
出力はいわずもがななので省略(というか捨ててしまった。。)