【问题标题】:While read line, awk $line读取行时, awk $line
【发布时间】:2013-04-26 00:36:05
【问题描述】:

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

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

我写了一个有意义的单行,但我不明白为什么它不起作用。

这是数字列表:

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

感谢您的帮助!

【问题讨论】:

    标签: unix loops awk while-loop readline


    【解决方案1】:

    您的主要问题是 awk 程序是单引号,因此 "$line" 变量永远不会扩展。快速修复是

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

    但是,不要那样做。您正在为 numbers 文件中的每一行读取一次输出文件。您只需阅读每个文件一次即可使其工作:

    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 但我认为重定向应该是 &gt; 而不是 &gt;&gt; 否则您必须先确保文件不存在。
    • 谢谢,这比一遍又一遍地阅读文件更有意义。太棒了:)
    【解决方案2】:

    尽量减少对 $x 字段变量的引用可以提高 Awk 的性能。它对更复杂的脚本很重要,但如果您正在处理具有数百万条记录的大文件,则值得尝试这种轻微的优化:

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

    【讨论】:

      猜你喜欢
      • 2013-04-30
      • 2013-04-30
      • 1970-01-01
      • 2020-06-25
      • 1970-01-01
      • 2011-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多