Linux 计算平均值而不考虑shell脚本中缺少的值?

Linux 计算平均值而不考虑shell脚本中缺少的值?,linux,shell,awk,Linux,Shell,Awk,我有一个数据集,其中有许多缺少的值,如-999。部分数据是 input.txt 30 -999 10 40 23 44 -999 -999 31 -999 54 -999 -999 -999 -999 -999 -999 -999 and so on 我想在不考虑缺失值的情况下计算每6行间隔的平均值 欲望输出是 ofile.txt 29.4 42.5 -999 当我试着用这个的时候 awk '!/\-999/{sum += $1; count++} NR%6==0{print count

我有一个数据集,其中有许多缺少的值,如-999。部分数据是

input.txt
30
-999
10
40
23
44
-999
-999
31
-999
54
-999 
-999
-999
-999
-999
-999
-999 and so on
我想在不考虑缺失值的情况下计算每6行间隔的平均值

欲望输出是

ofile.txt
29.4
42.5
-999
当我试着用这个的时候

awk '!/\-999/{sum += $1; count++} NR%6==0{print count ? (sum/count) : count;sum=count=0}' input.txt
它是给予

29.4
42.5
0

我不完全清楚为什么,如果你对
-999
值进行折扣,你会认为
-999
对于第三组的平均值来说是一个比零更好的选择。在前两组中,
-999
值既不影响总和也不影响计数,因此可以论证零是更好的选择

但是,您可能希望
-999
表示“缺少值”(在组中没有值的情况下肯定会出现这种情况)。如果是这种情况,您只需在原始代码中输出
-999
,而不是
count

awk '!/\-999/{sm+=$1;ct++} NR%6==0{print ct?(sm/ct):-999;sm=ct=0}' input.txt
即使您认为零是一个更好的答案,我仍然会将其显式化,而不是输出count变量本身:

awk '!/\-999/{sm+=$1;ct++} NR%6==0{print ct?(sm/ct):0;sm=ct=0}' input.txt

非常感谢你。我真的需要-999,因为数据中有很多0值。因此,如果我使用0而不是-999,那么现有的0值将被视为丢失。亲爱的paxdiablo,您能建议我是否要将上述脚本中的输出值设置为最多三个小数点吗?@Kayan,可能应该是另一个问题,但请看一下
awk'BEGIN{printf'%.3f\n',3.14159}“
它给出了
3.142
。换句话说,使用
printf
而不是
print
(并确保添加自己的换行,
print
会这样做,但
printf
不会)。