Bash 列相关平均值

Bash column dependant 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

像这样的东西会起作用:

$ awk '{a[]+=;++c[]}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 打印平均值,精确到小数点后一位。

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

没有数组的 Awk 方式假定所有数字都已分组

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

9       152.0
391     284.8
394     206.7
450     193.3