正文中带有 awk 命令的 For 循环不起作用

正文中带有 awk 命令的 For 循环不起作用

我正在尝试执行以下命令:

for i in test1.txt do awk '$1==$i {sum +=$4}END {print sum}' test2.txt

其中 test1.txt 如下所示:

A
B
C
D
E

但这不起作用。我想要实现的是,对于其中的每个字母测试1.txt文件,找到所有行测试2.txt第一列中具有相同字母的行,对于这些行,将第四列中的所有值相加

答案1

这里可以awk单独使用。

awk 'NR==FNR{a[$1]++; next} ($1 in a) {sum+=$4} END{print sum}' file1.txt file2.txt

答案2

这不能按照您编写的方式工作的原因是,它将awk解释$i为“第ith 字段”,并且由于该awk变量i没有值,您将收到错误,或者如果您使用的是 GNUawkmawk$i将与$0这是整行(使用mawk或 GNU awk,程序会查找第一列与整行相同的行)。

相反,要将 shell 变量“导入”到awk

awk -v i="$i" '$1 == i { sum += $4 } END { print sum }' test2.txt

另外,shell 变量的值$i将只是文件的名称test1.txt(因为这是您循环的内容)。

循环内容文件的:

while IFS= read -r i; do
    awk ...as above...
done <test1.txt

αГsнιn 的回答展示了如何在不使用 shell 循环的情况下做到这一点。

相关内容