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


以上是awk$4列,如果列=其后带有字符的值的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>