用于计算数据文件中数字列表的平均值的脚本

问题描述 投票:0回答:4

文件

data.txt
包含以下内容:

1.00 1.23 54.4 213.2 3.4

脚本的输出应该是:

ave: 54.646

一些简单的脚本是首选。

bash awk sed average
4个回答
99
投票

这是一种方法:

$ awk '{s+=$1}END{print "ave:",s/NR}' RS=" " file
ave: 54.646

56
投票

另一种选择是使用

jq
:

$ seq 100|jq -s add/length
50.5

-s
(
--slurp
) 在将每行解析为 JSON 后,为输入行创建一个数组,在本例中为数字。

编辑:

awk
更快,并且不需要将整个输入读取到内存中:

$ time seq 1e6|awk '{x+=$0}END{print x/NR}'>/dev/null

real  0m0.145s
user  0m0.148s
sys   0m0.008s
$ time seq 1e6|jq -s add/length>/dev/null

real  0m0.685s
user  0m0.669s
sys   0m0.024s

6
投票
perl -lane '$a+=$_ for(@F);print "ave: ".$a/scalar(@F)' file

如果您有多条线并且只需要一个平均值:

perl -lane '$a+=$_ for(@F);$f+=scalar(@F);END{print "ave: ".$a/$f}' file

0
投票

我必须找到平均值(每个 ping 请求所花费的时间)

ping -c 5 www.youtube.com | grep time= | awk -F '[= ]' '{ sum += $11 } END { printf("%.2f ms\n", sum/NR) }'
  • -c
    中的
    ping
    请求用于发送
    icmp
    请求的数量。

  • -F
    中的
    grep
    用于指定字段分隔符。

  • 我们可以使用

    printf
    来控制我们想要在小数点后显示的精度的数量,在我们的例子中它是2个小数点(
    %.2f
    )。

  • NR
    ”是
    AWK
    的特殊内置变量,代表“记录数”。该变量用于处理指定文件中存在的记录数。

  • 我们通过用 sum

     潜水 
    NR
     来计算 
    平均值


您还可以找到

sum
(ping 请求所花费的所有时间的总和)

ping -c 5 www.youtube.com | grep time= | awk -F '[= ]' '{ sum += $11 } END { printf("%.2f ms\n", sum) }'
© www.soinside.com 2019 - 2024. All rights reserved.