2013-05-01 81 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