文件
data.txt
包含以下内容:
1.00 1.23 54.4 213.2 3.4
脚本的输出应该是:
ave: 54.646
一些简单的脚本是首选。
这是一种方法:
$ awk '{s+=$1}END{print "ave:",s/NR}' RS=" " file
ave: 54.646
另一种选择是使用
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
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
我必须找到平均值(每个 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) }'