【问题标题】:Calculate avg of a row using awk使用 awk 计算行的平均值
【发布时间】:2018-05-14 20:22:15
【问题描述】:

我一直在编写一个脚本,该脚本通过读取 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

使用上面的 awk 表达式,我得到 156679 作为 row1 avg:"somewhere its reading blank space as variable) 的预期结果。

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

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

row1 expected avg :156509
row2 expected avg :151454

【问题讨论】:

  • 1而不是0开始循环计数器。字段从 1 到 NF 编号。 0 对应整个记录。
  • 尝试(i=1; i
  • i=0 应该是 i=1。与一般的 unix 计数方案相比,Awk 字段从 1 开始编号。
  • 嗨@karakfa 我做到了,但我相信当我使用 1 而不是 ) 时,它的阅读空间与预期结果相差太远,因为它是除以总和 /5 而不是 /4
  • @sjsam 我将其更改为 1 并且平均值为 /5 而不是 /4 --125207 因为 row1 avg 正在计算总数/5

标签: bash shell awk sed


【解决方案1】:

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

【讨论】:

  • 奇怪的是,它在 MAC 终端中对我有用,但在 GNU/Linux 上使用时,它会给出不同的输出。
  • @RajCM 我在 Gnu/Linux 终端上使用它,上面装有 Linux Mint...也许你的默认 shell 不是 bash 或尝试使用 gawk
【解决方案2】:

实现此目的的另一种更短的方法:

$ sed 's/ /+/g;s/.*/(&)\/4/g' file.txt | bc

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-26
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多