AWK变量和求和

时间:2019-05-07 02:43:55

标签: awk

我想了解以下awk命令在结果上的区别。

我已经读到,当awk引入数值变量时,它们默认情况下设置为零,因此将假定sum = 0将被隐式假定。

但是1)提供的结果不正确,而2)是正确的。

目标查找文件中的总行数而无需使用NR

financial.txt

14D 20190503 0.31 0.31 0.295 0.295 117949
14DO 20190503 0.00 0.00 0.00 0.07 0
1AD 20190503 0.18 0.19 0.18 0.19 54370
1AG 20190503 0.041 0.042 0.041 0.042 284890
1AL 20190503 0.00 0.00 0.00 0.88 0
1ST 20190503 0.05 0.05 0.049 0.049 223215
3DP 20190503 0.049 0.054 0.048 0.048 2056379
3PL 20190503 1.055 1.06 1.02 1.05 120685
4CE 20190503 0.00 0.00 0.00 0.009 0
4DS 20190503 0.072 0.076 0.072 0.075 2375896

$ awk 'BEGIN {sum+=1} END {print sum}' financial.txt

1

$ awk 'BEGIN {sum=0}{sum+=1} END {print sum}' financial.txt

5527

谢谢


查看评论后,我找到了不需要使用BEGIN的解决方案。

$ awk '{sum+=1}END{print sum}' financial.txt
5527

2 个答案:

答案 0 :(得分:3)

所有awk变量都初始化为零或零。如果首先在数字上下文中使用,则在该点变为0,而在字符串上下文中首先使用,则在该点变为null。编写您的代码示例,

BEGIN {sum+=1} END {print sum}

表示:

BEGIN {sum+=1}
END {print sum}

与此同时:

BEGIN {sum=0}{sum+=1} END {print sum}

表示:

BEGIN {sum=0}
<true> {sum+=1}
END {print sum}

看到区别了吗?在每个;print sum之前添加},以跟踪sum的填充情况(如果情况不明显)。

答案 1 :(得分:3)

来自GNU AWK Manual

A BEGIN rule is executed once only, before the first input record is read. Likewise, an END rule is executed once only, after all the input is read.

因此,以下内容将仅执行一次“ {sum + = 1}”语句。

awk 'BEGIN {sum+=1} END {print sum}' financial.txt

但是,在第二种情况下,将从文件中读取的每一行都执行“ {sum + = 1}”。

awk 'BEGIN {sum=0}{sum+=1} END {print sum}' financial.txt