固定行数的平均值

时间:2017-01-16 14:16:10

标签: awk

给出以下输入:

 256 1 4 1 130.363
 256 1 4 2 128.332
 256 1 4 3 130.262
 256 1 4 4 128.395
 256 1 4 5 128.484
 64 2 4 1 95.227
 64 2 4 2 96.582
 64 2 4 3 95.785
 64 2 4 4 93.944
 64 2 4 5 97.398
 64 4 4 1 143.519
 64 4 4 2 143.579
 64 4 4 3 143.937
 64 4 4 4 142.292
 64 4 4 5 143.304

我试图获得给定行数的平均值。在这种情况下,我有第4列指示的 5 样本。所以预期的输出应该是:

256 1 4 129.167
64 2 4  95.787
64 4 4  143.326

要循环播放,我尝试了类似

的内容
awk 'BEGIN {i = 1; while (s[$4] <= 5) { print $4 } }'

但它甚至不打印我想要的东西。也尝试了这个

awk  '{array[$1" "$2]+=$5} END { for (i in array) {print i" " array[i]/length(array)}}'

4 个答案:

答案 0 :(得分:3)

$ awk '{curr = $1 OFS $2 OFS $3} curr!=prev {if (cnt) print prev, sum/cnt; prev=curr; sum=cnt=0} {sum+=$5; cnt++} END{if (cnt) print prev, sum/cnt}' file
256 1 4 129.167
64 2 4 95.7872
64 4 4 143.326

这和@NinjaGaiden解决方案之间的区别在于:

  1. 这依赖于与键值相关的所有数据 如你的样本输入中所示是连续的,而NG则没有。
  2. 这不会在NG存储时将输入文件的内容保存在内存中。
  3. 这将按照输入中输出的顺序打印输出,而NG将以随机(哈希)顺序打印输出。

答案 1 :(得分:1)

试试这个

awk '{k=$1" "$2" "$3; j[k]+=$5;z[k]+=1} END { for (x in j) { print x,j[x]/z[x] }} ' f

答案 2 :(得分:0)

awk  '{array[$1" "$2" "$3]+=$5} END { for (i in array) {print i" " array[i]/length(array)}}'

答案 3 :(得分:0)

这也可以使用可变数量的行

NaN