我想得到一定数量的行的平均值,在这种情况下,这个数字由第二列决定
-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
,则意味着它是需要计算的新平均值。
这有意义吗?
答案 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