重複した質問であれば申し訳ありませんが、ここでもドキュメントでも探している回答が見つかりませんでした。
次のようなファイルがあります:
chr2_oligo1234 700 750
chr2_oligo1236 750 800
chr1_oligo1 50 100
chr1_oligo256 150 200
chr1_oligo6 3500 3550
chr4_oligo95 50 100
chr5_oligo1 50 100
chr4_oligo4 150 200
望ましい出力は次のようになります。
chr1_oligo1 50 100
chr1_oligo256 150 200
chr1_oligo6 3500 3550
chr2_oligo1234 700 750
chr2_oligo1236 750 800
chr4_oligo95 50 100
chr4_oligo4 150 200
chr5_oligo1 50 100
先頭のパターン (例: chr#_oligo#) は chr# に関してのみ重要です。つまり、chr1 が最初になり、次に chr2、chr3 の順になりますが、上記の目的の出力で示されているように、これらの部分文字列をグループごとに数値で並べ替えたいと思います。したがって、最初の列の場合はアルファベット順に並べ替え、その順序 (chr1->chrN) を維持しながら、各データ チャンクを数値で並べ替える方法を知りたいです。
私の表現がこの問題に対して最適でなかったり、重複していたりした場合はお詫び申し上げます。
sort -k1,1 -nk2
数値的には正しくソートされますが、最初のソートはそのまま維持されません (最初の列がごちゃ混ぜになり、2 列目と 3 列目が次のようになるすべての行が一緒に配置されます。
50 100
私はMac OS Xを使用しています。
編集: 最初の列の例をいくつか変更して、探しているものをより多く表示したいと思います。最初の列の名前が数字順になっている場合は gsort -V はうまく機能しますが、私のデータ セットでは必ずしもそうではありません。
基本的に、各サブグループ (この場合は、chr1、chr2 など) を列 2 で繰り返し並べ替えたいと思います。それぞれに対して grep を実行してから列 2 で並べ替えることで簡単に実行できることはわかっていますが、sort または別の UNIX コマンドだけでこれを実行できるかどうかを知りたいです。
答え1
sort -k1,1 -nk2
は と同じですsort -k1,1 -n -k2
。 と同じですsort -n -k1,1 -k2
。数値すべてのキーに対して、ソートがグローバルにオンになります。
2番目のn
キーを数値のみでソートするには、次のようにそのソート キーの説明を追加する必要があります。
sort -k1,1 -k2n
または:
sort -k1,1 -k2,2n
および を使用するとn
、デフォルトのフィールド区切り文字は2
と同じです2,2
が、 は2
2 番目のフィールドから始まる行の部分になりますが、数値として解釈されると、 2 番目のフィールドのみ ( 2,2
) と同じになります。
ここで、次のコードを使用して、後ろの数字で数値順に並べ替えchr
、次に最初のフィールドの残りでアルファベット順に並べ替え、最後に 2 番目のフィールドで数値順に並べ替えることもできます。
sort -k1.4n -k1,1 -k2n
答え2
最初のフィールドをアルファベット順に、2 番目のフィールドを数値順に並べ替えると、次のようになります (出力では、chr4_oligo95 が ch4_oligo4 の前にあります)
sort -k1,1 -k2n,2n file
chr1_oligo1 50 100
chr1_oligo256 150 200
chr1_oligo6 3500 3550
chr2_oligo1234 700 750
chr2_oligo1236 750 800
chr4_oligo4 150 200
chr4_oligo95 50 100
chr5_oligo1 50 100