Awk变量与求和
我想了解以下awk命令的结果差异 我已经读到,当awk引入数值变量时,它们默认设置为零,因此会假定sum=0将被隐式假定 但是,1)给出的结果不正确,而2)是正确的 目标:在不使用NR的情况下查找文件中的行总数 financial.txtAwk变量与求和,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
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
是在关闭最后一个输入文件之后为真的条件,因此其关联的操作将在该时间执行。手册页上都有描述,