2017-01-12 15 views
0

ファイルを特定の列で並べ替えることに関して同様の質問がされていることは知っていますが、Bash-別のファイルのリストに基づいてファイルをソート

私の入力ファイルは、

OHJ07_1_contig_10 0 500 130 500 500 1.0000000 
OHJ07_1_contig_10 500 1000 180 500 500 1.0000000 
OHJ07_1_contig_10 1000 1500 171 500 500 1.0000000 
OHJ07_1_contig_10 1500 2000 79 380 500 0.7600000 
OHJ07_1_contig_10 2000 2500 62 500 500 1.0000000 
OHJ07_1_contig_10 2500 3000 96 500 500 1.0000000 
OHJ07_1_contig_10 3000 3500 76 500 500 1.0000000 
OHJ07_1_contig_10 3500 4000 87 500 500 1.0000000 
OHJ07_1_contig_10 4000 4500 60 500 500 1.0000000 
OHJ07_1_contig_10 4500 5000 64 500 500 1.0000000 
OHJ07_1_contig_10 5000 5468 213 468 468 1.0000000 
OHJ07_1_contig_100 0 500 459 500 500 1.0000000 
OHJ07_1_contig_100 500 1000 156 500 500 1.0000000 
OHJ07_1_contig_100 1000 1314 77 305 314 0.9713376 
OHJ07_1_contig_1000 0 500 239 500 500 1.0000000 
OHJ07_1_contig_1000 500 1000 226 500 500 1.0000000 
OHJ07_1_contig_1000 1000 1500 238 500 500 1.0000000 
OHJ07_1_contig_1000 1500 2000 263 500 500 1.0000000 

のようにそれを生成したプログラムに見える英数字最初の列に名前に基づいてソートが、私は別のファイル内の名前のリストに基づいて、それをソートしたいと思い、他のすべてのデータを保持します。もう1つのファイルには、2列目のcontigの長さなどの情報があります(このファイルはsamtools faidxで作成されています)。

OHJ07_1_contig_25270 888266 96530655 60 61 
OHJ07_1_contig_36751 583964 120924448 60 61 
OHJ07_1_contig_44057 504884 134192571 60 61 
OHJ07_1_contig_21721 415942 87354744 60 61 
OHJ07_1_contig_46339 411691 143341916 60 61 
OHJ07_1_contig_44022 330441 133783765 60 61 

それぞれの名前の最初のファイルのエントリ数が異なるため、これを処理する最も簡単な方法は何ですか?好ましくはbashを使用してください

私は文字通りこれに取り組む方法がないので何も試していません。

+1

これまでに試したことを共有してください – fedorqui

+0

_別のファイルの名前のリストに基づいてソートしたいのですが_これはどういう意味ですか?他のファイルに記載されていない残りの部分をすべて削除してください。 –

+0

質問を編集して[これまでに試したこと](http://whathaveyoutried.com)を表示してください。問題のあるコードの[mcve]を含める必要があります。次に、特定の問題を解決するために役立つことができます。 [ask]も読んでください。 –

答えて

1

私は、行番号で順序を決定するファイルの各行を前に置いていますが、awkを使用する方法があります。ここで書かれた答えはhttps://superuser.com/questions/10201/how-can-i-prepend-a-line-number-and-tab-to-each-line-of-a-text-fileです(インデックスファイルが)インデックスとデータファイルはdata.txtを命名されるという名前:あなたは、任意の単語間のインデックス番号の対応になりますこのように

awk '{printf "%d,%s\n", NR, $0}' <index> index-numbered 

あなたが決めた数字注文します。 あなたはその後、例えば、それはインデックス行番号、コンマと行の残りの部分(名前を維持)とそれぞれ最初の単語を置き換えソートするファイルにしばらくを使用することができます。

57,OHJ07_1_contig_46339 411691 143341916 60 61 

をこのようにあなたができるようになります最初のフィールドである数値をソートすると、任意の順序が数値順に変換されます。

上記と同じ番号の新しいデータファイルを作成中:

while read line 
do 
    key=$(echo $line | cut -f1) 
    n=$(grep $key index-numbered | cut -d, -f1) 
    echo $n","$line >> indexed-data.txt 
done < data.txt 

を次に、あなたは、単に並べ替えを使用して、変更されたデータファイル(インデックスさ-data.txtを)を並べ替えるととして挿入行番号を使用してすることができますソートキー:

sort -k1 -n -t, indexed-data.txt >sorted-data.txt 

あなたは、最終的な出力に行番号を非表示にする場合は、これらに先行する命令を変更し、それぞれをフィルタリングすることができます

sort -k1 -n -t, indexed-data.txt | cut -d, -f2 > sorted-data.txt 

最終出力はファイルsorted-data.txtになります。

これは最高の解決策ではないと確信しています。多分他の人が私よりもうまく答えてくれるかもしれません。

関連する問題