计算平均值的最有效方法

时间:2013-09-17 14:17:19

标签: shell unix math awk

我有一个文件,看起来像:

Lorem ipsum dolor sit amet... 2465m
id porttitor libero mauris at magna... 1m
istique pretium tincidunt. V...1200m
...

我想计算(使用unix命令,awk,grep等)尾随数字的总和,我的意思是(2465 + 1 + 1200 + ...)/ NUMBER_OF_LINES。最好的方法是什么?

3 个答案:

答案 0 :(得分:4)

这就是:

$ awk '{sum+=$NF+0} END{print "total sum is " sum " and average " sum/NR}' file
total sum is 3666 and average 1222

$NF代表每一行的最后一个字。它使用$NF+0,因此不会考虑尾随m和其他字符。然后它将总和保存在最后打印的sum变量中。 最后打印平均值,将sum除以NR,其中包含已处理行数的值。

答案 1 :(得分:4)

我会这样做:

grep -oP '\d+(?=m\s*$)' file|awk '{_+=$0}END{printf "Avg: %0.2f\n",_/NR}'

它有两个进程,grep和awk,但它的作用是数字列/字段以非数字字符开头。像:

foo123 456 ffffff100m
xbar 222 444 bbbbb200m
234 df343 xxxxxx300m

通过上面的例子,输出:

Avg: 200.00

用你的例子输出:

Avg: 1222.00

答案 2 :(得分:2)

awk '{sum+=$NF}END{printf "Average: %0.2f\n",sum/NR}' file

输入:

Lorem ipsum dolor sit amet... 2465m
id porttitor libero mauris at magna... 1m
istique pretium tincidunt. V...1200m

输出:

Average: 822.00

某些部分实际上没有空格,不能与FS=" ."一起使用,因此您必须转换字符串。

awk '{t=$NF;gsub(/[^0-9]/,"",t);sum+=t}END{printf "Average: %0.2f\n",sum/NR}'

输出:

Average: 1222.00