awk$4列,如果列=其后带有字符的值
例如,我有一个包含以下数据的文件:
20 V 70000003d120f88 1 2
20 V 70000003d120f88 2 2
20x00 V 70000003d120f88 2 2
10020 V 70000003d120f88 1 5
我想获得第 4 列数据的总和。
使用下面的命令,我可以实现这一点,但行 20x00 被排除在外。我想从 20 开始的所有内容都必须求和,而在此之前没有任何内容,例如 20*:
cat testdata.out | awk '{if ($1 == '20') print $4;}' | awk '{s+=$1}END{printf("%.0fn", s)}'
输出值必须是:
5
我如何使用 awk 实现这一点。我尝试的以下内容也不起作用:
cat testdata.out | awk '$1 ~ /'20'/ {print $4;}' | awk '{s+=$1}END{printf("%.0fn", s)}'
回答
不需要使用3个进程,一个AWK进程可以做任何事情。一探究竟:
awk '$1 ~ /^20/ { a+=$4 } END { print a }' testdata.out
解释:
$1 ~ /^20/ checks to see if $1 starts with 20
if yes, we add $4 in the variable a
finally, we print the variable a
结果 5
编辑:
Ed Morton 正确地指出结果应该总是相同的类型,这可以通过在结果中添加 0 来解决。如果需要区分结果 0 是由于没有匹配(输出状态 0)还是仅匹配零值(输出状态 1),您可以设置退出状态。可以检查不同输入数据的退出代码,例如 echo $? 代码如下所示:
awk '$1 ~ /^20/ { a+=$4 } END { print a+0; exit(a!="") }' testdata.out