我有一列数据如下:
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可以做到这一点吗?
答案 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)}'
:...打印最后的平均值