bash:如何计算不同列的平均值?

时间:2018-11-13 03:13:26

标签: bash awk time mean

我正在编写一个脚本,用于自动计算平均运行时间。

首先,我需要运行$ time ./foo.py 100次并将输出保存到文件time.txt(工作)

$ for i in `seq 100`; do { time ./foo.py; } 2>> time.txt; done

输出如下所示

time ./foo.py
real    0m0,030s
user    0m0,030s
sys     0m0,000s
[...]

来自不同脚本的运行时位于同一文件中。每个条目都以time ./foo.py开头,然后是realusersys的100个“三元组”。

现在,如果可能的话,我希望脚本可以通过使用全部100个“三胞胎”自动计算每个测试文件的平均运行时间,并且仅返回一个“均值三胞胎”。

我曾考虑过可能使用awk这样来计算平均值

awk '{ total += $2 } END { print total/NR }' time.txt

但是该命令需要进行调整以满足我的需要-毕竟,只有,之后的部分(例如,030s)才可以用于计算,而s也需要忽略。

由于我不知道如何实现这一目标,所以我想问问社区。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

如果告诉time以POSIX格式输出时间信息会更容易:

awk '/^real/ { totalReal += $2 } /^user/ { totalUser += $2 } /^sys/ { totalSys += $2 } END { print "realAvg " totalReal/(NR/4) "\n" "userAvg " totalUser/(NR/4) "\n" "sysAvg  " totalSys/(NR/4) }' time.txt

打印输出如下:

realAvg 12.62
userAvg 27
sysAvg  3.8

说明:

  • 基本上,告诉awk浏览文件中的每一行,如果该行以real开头,则将其添加到totalReal变量中,与user相同和sys。因此,基本上,要对这三种“类型”中的每一种保持连续运行。
  • 最后,只需打印三个运行总计,除以行数除以除以4 。这是因为您希望将4行的每个“集合”都计为1个实例,而awk的NR只计算行数。