Bash - 计算列的平均值和频率

Ang*_*nda 5 bash awk

我正在运行一个 shell 脚本,该脚本对我的服务执行负载测试。在测试结束时,我得到一个如下所示的文件:

200    2.691
200    2.735
404    1.997
404    2.838
200    1.394
200    1.833
Run Code Online (Sandbox Code Playgroud)

我想计算每个唯一 HTTP 响应代码的最小、最大和平均响应时间。像这样的东西——

http    min    max    mean    count
200    1.394  2.735   2.163    4
404    1.997  2.838   2.418    2
Run Code Online (Sandbox Code Playgroud)

输出源自此命令(如果有帮助):

curl -s -o /dev/null -w "%{http_code}\t%{time_total}\n" $SERVICE_URL

有人可以分享有关如何在 bash 中实现这一目标的指示吗?我查看了http://cacodaemon.de/index.php?id=11的想法,但无法做出任何工作。

谢谢。

Ed *_*ton 3

$ cat tst.awk
{
    min[$1] = ( ($1 in min) && (min[$1] < $2) ? min[$1] : $2 )
    max[$1] = ( ($1 in max) && (max[$1] > $2) ? max[$1] : $2 )
    sum[$1] += $2
    cnt[$1]++
}
END {
    print "http", "min", "max", "mean", "cnt"
    for (key in cnt) {
        print key, min[key], max[key], sprintf("%.3f",sum[key]/cnt[key]), cnt[key]
    }
}

$ awk -f tst.awk file | column -t
http  min    max    mean   cnt
200   1.394  2.735  2.163  4
404   1.997  2.838  2.417  2
Run Code Online (Sandbox Code Playgroud)

上面的代码适用于任何 UNIX 机器上任何 shell 中的任何 awk。