如何按顺序乘以列的条目并取平均值

时间:2014-10-27 12:49:39

标签: awk

我有一列数据如下:

6.14001 
6.13606 
6.13752 
6.12979 
6.13292 
6.13987 
6.13182 
6.13528 
6.13161 
6.13784 
6.13439 
6.13448 
6.13165 
6.13396 
6.13786 
6.13502 

如何执行以下操作:以连续方式(1 * 2)+(2 * 3)+(3 * 4)...)乘以条目并取平均值...然后开始乘法从2(2 * 3)+(3 * 4)+(4 * 5)得到这个平均值然后从3开始,依此类推。用awk可以做到这一点吗?

2 个答案:

答案 0 :(得分:0)

在数组中保存数字后,您可以执行所需的操作:

awk '{a[NR]=$0} END{
    for(i=1;i<NR;i++){
        s[i]=a[i]*a[i+1]
        t+=s[i]
    }
    for(i=NR-1;i>0;i--){t-=s[NR-1-i];printf "%d: %.5f\n",++x, t/i}
}' file

输出您的数据:

1: 37.63623
2: 37.63343
3: 37.63137
4: 37.63217
5: 37.63569
6: 37.63373
7: 37.63208
8: 37.63353
9: 37.63559
10: 37.63571
11: 37.63247
12: 37.63277
13: 37.63886
14: 37.65264
15: 37.65589

答案 1 :(得分:0)

这对我有用:

for i in $(seq 1 $(grep -c ^ file))
do
  tail -n +$i file | awk 'a{s+=a*$1} !a{a=$1} END{printf "%f\n", s/(NR-1)}'
done

它提供以下输出:

37.666943
37.642103
37.649667
37.604576
37.624784
37.664363
37.616733
37.637496
37.617603
37.652948
37.631992
37.632719
37.621433
37.640678
37.655894
-nan

<强>解释

  • for i in $(seq 1 $(grep -c ^ file)):从1到文件中行数的循环
  • tail -n +$i file:跳过第一个$i
  • awk 'a{s+=a*$1} !a{a=$1}:进行计算并......
  • END{printf "%f\n", s/(NR-1)}':...打印最后的平均值