*这是一个重复的问题: 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
答案 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