根据另一个字段中的变量获取字段中值的平均值

Ars*_*ala 5 awk text-processing

有没有办法根据另一个字段中的变量获得一个字段中值的平均值?例如对于以下输入

a x 3
b y 4
a y 2
b x 5
b x 20
Run Code Online (Sandbox Code Playgroud)

我想要这个输出

a 2.5
b 9.67
Run Code Online (Sandbox Code Playgroud)

我发现这个 awk 脚本可以获取列中值的平均值

awk '{ total += $3; count++ } END { print total/count }' file.txt
Run Code Online (Sandbox Code Playgroud)

但是如何在其中添加 for 循环以获得第 1 列中每个变量的平均值?

该文件以制表符分隔。

谢谢

Rud*_*diC 7

你离得不远了。尝试由$1以下索引的数组:

awk '{ total[$1] += $3; count[$1]++ } END {for (t in total) print t, total[t]/count[t]}' file
a 2.5
b 9.66667
Run Code Online (Sandbox Code Playgroud)

或者,如果您最多需要两个小数点,如您的问题所示:

$ awk '{ total[$1] += $3; count[$1]++ } END {for (t in total) printf "%s %.2f\n", t, total[t]/count[t]}' file
a 2.50
b 9.67
Run Code Online (Sandbox Code Playgroud)

  • @terdon:为什么不定义 `OFMT="%.2f"` ?而且,顺便说一句,“2.5”不需要两位小数。 (2认同)

ste*_*ver 3

米勒对于像这样的任务也很得心应手。

$ mlr --nidx stats1 -a mean -f 3 -g 1 file.txt
a 2.500000
b 9.666667
Run Code Online (Sandbox Code Playgroud)

或(带有动词的更新版本format-values

$ mlr --nidx stats1 -a mean -f 3 -g 1 then format-values -f '%.2f' file.txt
a 2.50
b 9.67
Run Code Online (Sandbox Code Playgroud)