我正在尝试执行以下命令:
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
为“第i
th 字段”,并且由于该awk
变量i
没有值,您将收到错误,或者如果您使用的是 GNUawk
或mawk
,$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 循环的情况下做到这一点。