Awk变量与求和

Awk变量与求和,awk,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

我想了解以下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
一,

5527

谢谢


在查看评论之后,我找到了不使用BEGIN的解决方案

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

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

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

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

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

BEGIN {sum+=1}
END {print sum}
BEGIN {sum=0}
<true> {sum+=1}
END {print sum}
BEGIN{sum=0}
{sum+=1}
结束{打印和}
看到区别了吗?添加
;在每次
}
之前打印sum
,以跟踪
sum
是如何填充的,如果不清楚发生了什么情况。

来自:

因此,下面只执行一次“{sum+=1}”语句

awk 'BEGIN {sum+=1} END {print sum}' financial.txt
但是,在第二种情况下,对从文件中读取的每一行执行“{sum+=1}”

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

好啊在这种情况下,{sum=0}对BEGIN语句有什么区别?它是否作为一个for循环来遍历每个记录用户刚刚编辑1)对于空文件,
END
部分中的
print sum
将打印0而不是null。2) 这个问题中的“it”是什么?从我所看到的,BEGIN似乎应用于紧跟其后的语句,在本例中,sum=0确保它只执行一次。{sum+=1}不受BEGIN语句的约束,因此它每行执行一次。我认为BEGIN应用于END.awk之前的整个代码块是由
条件{action}
语句组成的
BEGIN
是在打开第一个输入文件之前为真的条件,因此关联的
{action}
将在该时间执行,就像
END
是在关闭最后一个输入文件之后为真的条件,因此其关联的操作将在该时间执行。手册页上都有描述,