在awk中平均多个列,不包括空值

时间:2016-06-15 17:09:40

标签: awk null average

我需要将此文件中的所有列从第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”),我想从平均值中排除。

任何建议都会有所帮助。

1 个答案:

答案 0 :(得分: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

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