给定行数的平均值

时间:2016-11-10 10:42:53

标签: awk

我想得到一定数量的行的平均值,在这种情况下,这个数字由第二列决定

-1 1 22.776109913596883 0.19607208141710716
-1 1 4.2985901827923954 1.0388892840309705
-1 1 4.642271812306717 0.96197712195674756
-1 2 2.8032298255711794 1.5930763994471333
-1 2 2.9358628368936479 1.5211062387604053
-1 2 4.9987168801017106 0.8933811184867273
 1 4 2.6211673161014915 1.7037291934441456
 1 4 4.483831056393683 0.99596956735821618
 1 4 9.7189442154485732 0.4594901646050486

预期输出为

-1 1 0.732313
-1 2 1.33585
 1 4 1.05306

我已经完成了

awk '{sum+=$4} (NR%3)==0 {print $2,$3,sum/3;sum=0;}' test

有效,但我想(以某种方式)概括(NR%3)==0,以便awk意识到第二列的值已经改变,因此意味着它是需要计算的新平均值。例如,前三行在第二列中的值为1,因此一旦1更改为2,则意味着它是需要计算的新平均值。

这有意义吗?

2 个答案:

答案 0 :(得分:1)

尝试类似:

awk '{sum[$2] += $4; count[$2] += 1; }
     END { for (k in sum) { print k " " sum[k]/count[k]; } }'

未经测试,但这就是想法......

用这种方法,最后打印出计算结果;如果输入是一些无限的流,它可能不是你想要的,但根据你的例子,我认为应该没问题。

如果您还要保留第一列,则可以使用相同的系统完美地完成。

答案 1 :(得分:0)

你也可以试试这个;

awk  '{array[$1" "$2]+=$4} END { for (i in array) {print i" " array[i]/length(array)}}' test | sort -n

测试;

$ awk  '{array[$1" "$2]+=$4} END { for (i in array) {print i" " array[i]/length(array)}}' test | sort -n
-1 1 0.732313
-1 2 1.33585
 1 4 1.05306