2014-10-27 76 views
0

我有一列数据,看起来像这样:如何乘列顺序一个条目,并取平均值

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可以做到这一点吗?

+1

你为什么不试一试并告诉我们你的代码? – 2014-10-27 12:53:01

+0

您是否希望每次计算总计到列表的末尾,还是以3为一组? – 2014-10-27 12:59:36

回答

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 
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)}':...打印结束时的平均值
+0

感谢您的解释。 – amir 2014-10-30 10:10:28