使用 awk/while 使用列表来过滤具有多列的文件?

使用 awk/while 使用列表来过滤具有多列的文件?

我可能在这里做了一些愚蠢的事情(awk 新手)......

我有一个包含多列的 BigFile,我想通过名称列表 (NamesList) 过滤行。这些名称包含在文件的第四列中。

尝试使用 while 循环

while read -r line; do 
cat BigFile.txt | awk '{if ($4=="$line") print $0;}' >> Output.txt
done < NamesList.txt

将过滤后的行打印到 Output.txt。这给了我一个空白文件:(

我究竟做错了什么?有更好的方法来解决这个问题吗?

答案1

您的实现的主要问题是它"$line"不会被 shell 扩展,因为它位于包含 awk 表达式的单引号内。

可以传入$lineawk 如下:

cat BigFile.txt | awk -v line="$line" '{if ($4==line) print $0;}' >> Output.txt

(请注意,这是一个对猫的无用利用)。但是,除非您特别需要按照循环实现生成的顺序进行匹配,否则最好通过让 awk 直接处理两个文件来跳过整个 shell 循环。

awk 'NR==FNR{a[$0]; next} $4 in a' NamesList.txt BigFile.txt > Output.txt

(我假设您只是>>因为 shell 循环而使用)。

相关内容