读取行时,awk $行

时间:2013-05-01 23:09:43

标签: unix loops awk while-loop readline

我有一个包含数字列表的文件。我有第二个文件,其中包含各种条目和几个字段。

我想要做的是获取第12个字段等于第1个数字的所有行,并将它们放在新文件中,然后放到第二个数字,依此类推。

我写了一个有意义的单行,但我无法弄清楚为什么它不起作用。

这是数字列表:

cat 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”等,但所有文件都是空的。

感谢您的帮助!

2 个答案:

答案 0 :(得分:3)

你的主要问题是awk程序是单引号,所以“$ line”变量永远不会扩展。快速修复是

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 :(得分:0)

最小化对$ x字段变量的引用可以提高Awk性能。它主要适用于更复杂的脚本,但是如果您要处理包含数百万条记录的大型文件,则值得尝试这种轻微的优化:

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