多个数字的平均值 - Shell 脚本

多个数字的平均值 - Shell 脚本

我创建了一个脚本,用于查看日志文件并针对特定数量的毫秒/秒进行 grep。我创建了一个脚本,用于查看最小值和最大值,但我需要找到列表的平均值。

logdir_8080='/opt/product/apachetomcat/8.5.5_8080/logs'
cd "$logdir_8080"

get_file=`ls -rt localhost_access_log.*.txt|tail -1`

cat $get_file | tail -1000 | grep "objectId" | awk -F 'HTTP/1.1" 200' '{ 
print $2}'|awk -F' ' '{ print $2 }' | sort - n>/opt/product/apachetomcat/apm/epagent/epaplugins/centrica/correspondence_log_files/8080.txt

最小值:

cat /opt/product/apachetomcat/apm/epagent/epaplugins/centrica/correspondence_log_files/8080.txt|head -1

最大值:

cat /opt/product/apachetomcat/apm/epagent/epaplugins/centrica/correspondence_log_files/8080.txt|tail -1

清单的想法:

233
249
283
283
302
303
332
333
643
851
965
965
972
1022
1135
1182
1213
1232
1264
1273
1390
1403
1414
1429
1474
1537
1540
1543
1545
1556
1565
1566
1577
1589
1591
1599
1602
1621
1622
1647
1653
1705
1740
1772
1774
1933
1935
1983
1990

如何求平均值?

答案1

如果您的文件中只有数字,则可以使用单个 awk 命令来获取所有内容。

awk 'BEGIN {themin=10000000; themax=0; thecount=0; thesum=0}
    {for (i=1; i<=NF; i++) {
        thesum += $i;
        thecount++;
        if ($i < themin) {themin = $i}
        if ($i > themax) {themax = $i}
    }}
    END {
      printf("The min is %d\nThe max is %d\nThe sum is %d\nThe total number of items is %d\nThe average of those items is %d\n", themin, themax, thesum, thecount, int(thesum/thecount))
}' _file_

我将其分解开来以便您可以看到不同的部分。

BEGIN 只是初始化所有要使用的变量。变量 themin 可以设置为您想要的任何大值,只要它大于文件中的任何值即可。

中间部分只是循环遍历每一行以及该行中的每个字段。它将数字相加,并计算所有数字的数量,以便最后进行简单的除法。两个 if 语句收集您的最小值和最大值。

END 打印出所有相关信息,包括最小值、最大值和平均值。

希望这可以帮助。

答案2

对于已经有出色解决方案的问题,无需自己编写解决方案。毕竟,您是在 SuperUser 上提问,而不是在 StackOverflow 上提问。

例如使用 GNUdatamash

$ datamash min 1 max 1 mean 1 < yourFile
233     1990    1272.0408163265

或者使用包中的工具num-utils

$ numbound -l yourFile
233
$ numbound yourFile
1990
$ numaverage yourFile
1272.04081632653

相关内容