使用awk计算文本行平均值结果不符的技术问询
修正awk计算行平均值的错误
你的问题出在awk循环的字段索引上!在awk中,字段是从$1开始编号的,$0代表的是整行的完整内容,而你写的循环for(i=0; i<=NF; i++)会把$0也加到总和里——这就相当于把整行的所有数值又额外加了一遍,直接导致总和偏大,计算出的平均值自然和预期不符。
修正后的awk命令
awk '{sum=0; for(i=1; i<=NF; i++){sum+=$i}; sum/=NF; print sum}' input.txt
为什么这样能解决问题?
- 循环从
i=1开始,遍历当前行的每一个字段($1到$NF,NF是awk内置变量,代表当前行的字段总数) - 只累加每行的独立数值,不会把整行内容重复计入总和
- 用总和除以字段数
NF,得到的就是正确的行平均值
用这个命令测试你的样本输入:
- 第一行的四个数计算结果为
(157361+155687+156158+156830)/4 = 156509,完全符合预期 - 第二行的数值也会得到正确的
151454
更简洁的写法(可选)
如果追求代码简洁,还可以去掉冗余的大括号(单语句循环不需要):
awk '{sum=0; for(i=1;i<=NF;i++)sum+=$i; print sum/NF}' input.txt
内容的提问来源于stack exchange,提问作者RCzone
相关产品推荐
相关产品推荐

