Unix をアルファベット順に並べ替え、次に数字順に並べ替えるが、意図したとおりに動作しない

Unix をアルファベット順に並べ替え、次に数字順に並べ替えるが、意図したとおりに動作しない

重複した質問であれば申し訳ありませんが、ここでもドキュメントでも探している回答が見つかりませんでした。

次のようなファイルがあります:

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が、 は22 番目のフィールドから始まる行の部分になりますが、数値として解釈されると、 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

関連情報