我想了解以下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
答案 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)
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