Loops 将多行awk命令放入for循环中而不打印变量

Loops 将多行awk命令放入for循环中而不打印变量,loops,for-loop,awk,Loops,For Loop,Awk,我有一个如下的命令,它根据IDs文件中的行,从过敏原文件中获取行 awk ' FNR==NR{ a[$1] next } /^Query/ || $2 in a ' IDs C100_Allergens | grep -B 1 'Hit: ' | grep -v '^--' > C100_Allergens_matches.txt 但是,我有许多样本过敏原文件,并希望以循环方式运行它,其中列表是一个具有不同样本名称的文件: for i i

我有一个如下的命令,它根据IDs文件中的行,从过敏原文件中获取行

awk '
    FNR==NR{
    a[$1]
    next
    }
    /^Query/ || $2 in a
    ' IDs C100_Allergens | grep -B 1 'Hit: ' | grep -v '^--'  > C100_Allergens_matches.txt
但是,我有许多样本过敏原文件,并希望以循环方式运行它,其中列表是一个具有不同样本名称的文件:

for i in `cat list`
do
    awk '
    FNR==NR{
    a[$1]
    next
    }
    /^Query/ || $2 in a
    ' IDs "$i"_Allergens | grep -B 1 'Hit: ' | grep -v '^--'  > "$i"_Allergens_matches.txt
done
我尝试了这个循环,包括使用awk的变量标志,即-v I=“$I”:


我只会不断收到空文件。提前感谢您的帮助

从第一个文件中选择行的习惯用法是
FNR==NR
(F后面的no
=
)。您的awk脚本没有使用任何变量i,因此设置
-vi=
无效且无用。感谢@dave_thompson_085,这是一个拼写错误,现已修复,即FNR==nr在shell和awk代码中添加一些调试打印,以查看失败的地方。另请参阅,了解如何编写shell循环(假设您确实希望这样做)。无论它应该做什么,将awk输出管道化为2 greps和第二管道都是错误的方法。亲爱的@EdMorton,再次感谢您的指点。然而,陈述某事是一种“错误的方法”,而不是帮助寻求帮助的人是有点徒劳的。另一方面,感谢你对如何编写shell循环的见解。我不能告诉你做任何你想做的事情的正确方法,因为我不知道你想做什么。所以我有两个选择——1)让你知道这是一个糟糕的方法,这样你可以在提供更多信息后进行调查和/或提出问题;2)不让你知道这是一个糟糕的方法,所以你可以继续这样做。很遗憾听到做1是徒劳的。
for i in `cat list`
    do
        awk -v i="$i" '
        FNR==NR{
        a[$1]
        next
        }
        /^Query/ || $2 in a
        ' IDs "$i"_Allergens | grep -B 1 'Hit: ' | grep -v '^--'  > "$i"_Allergens_matches.txt
    done