2013-05-01 46 views
0

我有一個包含數字列表的文件。我有第二個文件與各種條目和幾個領域。

我想要做的是讓他們第12場等於第1號的所有行並將其放置在一個新的文件,然後到第二個數,依此類推。

我寫了一個班輪是有道理的,但我不明白,爲什麼它不會工作。

這是一個數字的列表:

truncations_list.txt

3 
318 
407 
412 
7 

與要排序的條目的文件是:

M00970:45:000000000-A42FD:1:1101:14736:1399 TGCCCAGTGCTCTGAATGTNNNNNTGAAGAAATTCAAGTAAGCGCGGGTCATCGGCNGGAGTAACTATGACTCTNTTAAGGAGGACCAATATGAACCANACNNNNNNNNNACTNTATCTAGGGTTCCCTGCACAGTATGTGNCC 79 TGCCCAGTGCTCTGAATGTNNNNNTGAAGAAATTCAAGTAAGCGCGGGTCATCGGCNGGAGTAACTATGACTCTNTTAA 65 GGAGGACCAATATGAACCANACNNNNNNNNNACTNTATCTAGGGTTCCCTGCACAGTATGTGNCC 79S65M 1 81 TGCCCAGTGCTCTGAATGTNNNNNTGAAGAAATTCAAGTAAGCGCGGGTCATCGGCNGGAGTAACTATGACTCTNTTAAGG -2 318 
M00970:45:000000000-A42FD:1:1101:15371:1399 TGCCCAGTGCTCTGAATGTNNNNNTGAAGAAATTCAAGTAAGCGCGGGTCAACGGCNGGAGTAACTATGACTCTNTTAAGGAGTCGGTGTTCACATGCNATNNNNNNNNNCAGNCGAACTTGATGAAGAACGTCGACGTGTNGG 83 TGCCCAGTGCTCTGAATGTNNNNNTGAAGAAATTCAAGTAAGCGCGGGTCAACGGCNGGAGTAACTATGACTCTNTTAAGGAG 61 TCGGTGTTCACATGCNATNNNNNNNNNCAGNCGAACTTGATGAAGAACGTCGACGTGTNGG 83S61M 1 81 TGCCCAGTGCTCTGAATGTNNNNNTGAAGAAATTCAAGTAAGCGCGGGTCAACGGCNGGAGTAACTATGACTCTNTTAAGG 2 407 

這是我的命令:

file="truncations_list.txt" 
while read line; do awk '$12==$line' R2_Output.txt >reads_$line.txt ; done <"$file" 

該命令將創建所有文件「reads_412.txt」等,但所有文件都是空的。

我感謝您的幫助!

回答

3

你的主要問題是,awk程序是用單引號,所以「$線」變量從未被擴大。快速解決方案是

awk -v num=$line '$12==num' R2_Output.txt 

但是,不這樣做。您正在讀取數字文件中每行一次的輸出文件。您只需讀取每個文件一次即可使其工作:

awk ' 
    # read the list of numbers in truncations_list 
    FNR == NR { 
     num[$1] 
     next 
    } 

    # process each line of the output file 
    # any lines with an "unknown" $12 will be ignored 
    $12 in num { 
     f = "reads_" $12 ".txt" 
     print >> f 
    } 
' truncations_list.txt R2_Output.txt 
+1

+1但我認爲重定向應該'''而不是'> >'或者你必須確保文件不首先存在。 – 2013-05-02 12:26:36

+0

謝謝,這比一遍又一遍地讀取文件更有意義。輝煌:) – 2013-05-02 16:03:18

+0

@EdMorton是的,對!謝謝! – 2013-05-02 16:03:34

0

最小化引用$ x字段變量可以提高Awk性能。它主要是爲更復雜的腳本,但它值得嘗試這種輕微的優化,如果你正在處理大型文件與數百萬記錄:

awk 'FNR==NR {a[$1]; next} (f=$12) in a {print >f}' trunc.txt R2_Out.txt