【问题标题】:averaging multiple columns in awk excluding null value [duplicate]平均 awk 中的多列,不包括空值
【发布时间】:2016-06-16 02:19:20
【问题描述】:

我需要平均该文件中从第 3 列到最后一列的所有列,不包括第 1 行: table

jd h 3 5 8 10 11 14 15
79 1 52.0 51.0 58.0 45.0 59.0 20.0 27
79 2 52.0 51.0 58.0 45.0 59.0 20.0 -999.0
79 3 52.0 51.0 58.0 45.0 59.0 20.0 -999.0
79 4 -999.0 51.0 58.0 45.0 59.0 20.0 -999.0

数据由Chet转录。

这个脚本运行良好:

cat myfile.txt | awk ' NR>1{for (i=3;i<=NF;i++){a[i]+=$i;}} END {for (i=3;i<=NF;i++) {print a[i]/(NR-1)}}' > myoutput.txt

问题是在列中我有空值(标记为“-999.0”),我想从平均值中排除。

任何建议都会有所帮助。

【问题讨论】:

  • 请将示例文件作为文本添加到问题中,以便我们进行测试。
  • 欢迎来到 Stack Overflow。请注意,在这里说“谢谢”的首选方式是投票赞成好的问题和有用的答案(一旦你有足够的声誉这样做),并接受对你提出的任何问题最有帮助的答案(这也给出了你的声誉小幅提升)。请参阅About 页面以及How do I ask questions here?What do I do when someone answers my question?

标签: awk null average


【解决方案1】:
awk 'NR > 1 { for (i = 3; i <= NF; i++) if ($i != -999.0) { sum[i] += $i; num[i]++; } }
     END    { for (i = 3; i <= NF; i++) print i, sum[i], num[i], sum[i]/num[i] }' \
    myfile.txt > myoutput.txt

这仅计算有效字段值,并分别计算每列的此类行数。最后的打印标识了字段、原始数据(总和、数字)和平均值。

【讨论】:

  • 非常感谢!效果很好
猜你喜欢
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 2019-04-03
  • 2021-12-11
  • 2012-05-31
  • 1970-01-01
  • 2021-11-22
  • 2017-05-22
相关资源
最近更新 更多