bash - 使用awk计算一行的平均值

标签 bash shell awk sed

我一直在编写一个脚本,通过从 txt 文件读取输入来计算行的平均值

示例文本输入文件 input.txt

157361 155687 156158 156830
149610 151824 152353 152027
159195 158490 159030 159243
153222 154227 154578 154390
168761 170078 170044 170107
147166 146477 146735 147678
155745 152142 155141 154140
148860 150040 149223 148246
147239 149693 148144 147990
148045 147987 149466 149535
146945 146206 145681 145852
156559 155188 156274 154962
143169 143798 142753 144045
153814 153320 153732 156621

我正在处理以下 awk 命令:

awk '{sum=0; for(i=0; i<=NF; i++){sum+=$i}; sum/=NF; print sum}' input.txt

我得到 156679 作为 row1 avg 的预期结果:“某处它的读取空白作为变量)与上面的 awk 表达式。

cal row1 excpected avg would be :(157361+155687+156158+156830)/4 = 156509

我没有得到预期的输出,我得到的平均值是错误的,上面输入文件的预期平均值

row1 expected avg :156509
row2 expected avg :151454

最佳答案

AWK 中的字段编号从 1 开始,而不是从 0 开始。因此,在您的 for 循环中,您需要放入 i = 1

正在做:

awk '{sum = 0; for (i = 1; i <= NF; i++) sum += $i; sum /= NF; print sum}' input.txt

我得到了正确的结果:

156509
151454
158990
154104
169748
147014
154292
149092
148266
148758
146171
155746
143441
154372

关于bash - 使用awk计算一行的平均值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50338445/

相关文章:

perl - 如何仅在您指定的某个任意字段上进行正则表达式替换

linux - awk中的两个文件数字比较

arrays - 如何将关联数组作为参数传递给 Bash 中的函数?

linux - 根据参数将 bash 中的命令替换为其他命令

macos - 伪终端不会分配,因为标准输入不是终端&困惑 : ttyname failed: Inappropriate ioctl for device

linux - 在 bash shell 上循环 "for..do"

regex - AWK Regex 查找特定模式

linux - 递归模式下的 Wget 输出

linux - 是否有一个 bash 命令可以告诉 shell 变量的大小

linux - Shell:如何为一个正在执行的命令设置工作目录而不影响一行中的其他命令