Bash列依赖平均值

时间:2015-04-17 11:20:38

标签: linux bash awk average

*这是一个重复的问题: calculate and print the average value of strings in a column

我有一个包含两列的文件:

9       152
391     576
391     104
391     335
391     129
391     280
394     184
394     64
394     313
394     159
394     335
394     159
394     66
394     435
394     145
450     318
450     131
450     131

(实际是几千行)

我正在尝试为左边的每个数字生成一个平均值,我正在寻找的输出将是(保持小数点后一位):

9     152
391   284.8
394   206.6

我已经知道解决方案是一个awk命令,也许也使用uniq,就我所知。

另一个需要相同的文件:

2014-05-10 23:50        335
2014-05-10 23:50        134
2014-05-10 23:50        134
2014-05-10 23:50        610
2014-05-10 23:50        131
2014-05-10 23:50        315
2014-05-10 23:50        131
2014-05-10 23:50        1055
2014-05-10 23:50        315

2 个答案:

答案 0 :(得分:2)

这样的事情会起作用:

$ awk '{a[$1]+=$2;++c[$1]}END{for(i in a)printf "%d\t%.1f\n", i, a[i]/c[i]}' file
391     284.8
394     206.7
9       152.0
450     193.3

数组a为第一列中的每个数字保留一个单独的总和。 c会计算每个平均值的行数。处理完文件后,将打印第一列中每个数字的平均值。格式说明符%.1f打印平均值,正确到1位小数。

请注意,数组a中的键顺序未定义,因此输出的顺序与输入的顺序不同。如果有必要,它很容易解决这个问题。

答案 1 :(得分:0)

没有数组的awk方式假设所有数字都被分组

 awk 'x~/./&&x!=$1{printf "%d\t%.1f\n",x,y/z;y=z=""}
      {x=$1;z++;y+=$2}END{printf "%d\t%.1f\n",x,y/z}' file

9       152.0
391     284.8
394     206.7
450     193.3