2016-11-10 56 views
0

我想获得一定的行数的平均值,在这种情况下,该数量由第二列平均行

-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,则意味着它是需要计算的新平均值。

这是否有意义?

回答

1

试着这么做:

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

没有测试,但是那是想法...

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

如果你想保留第一列,你可以完全用同一个系统来做。

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