在 bash 中,我可以从这样的日志文件中 grep 一些时间测量值
grep "time:" myLogfile.txt | cut -d' ' -f 3 >> timeMeasurements.txt
#timeMeasurements.txt
2.5
3.5
2.0
...
现在我想从 中的值计算平均值timeMeasurements.txt
。在 bash 中最快的方法是什么?
我知道有 gnuplot 和 R,但似乎必须为它们中的任何一个编写一些冗长的脚本。
在 bash 中,我可以从这样的日志文件中 grep 一些时间测量值
grep "time:" myLogfile.txt | cut -d' ' -f 3 >> timeMeasurements.txt
#timeMeasurements.txt
2.5
3.5
2.0
...
现在我想从 中的值计算平均值timeMeasurements.txt
。在 bash 中最快的方法是什么?
我知道有 gnuplot 和 R,但似乎必须为它们中的任何一个编写一些冗长的脚本。
强制性GNU datamash版本
旁白:感觉这确实应该可以在本地实现
bc
(即不使用外壳或外部程序来循环输入值)。GNUbc
实现包括一个read()
函数——然而,让它检测输入结束似乎非常困难。我能想到的最好的是:然后,您可以通过管道传输文件输入,前提是您使用任何非数字字符终止输入,例如
你可以使用
awk
. Bash 本身数学不是很好...笔记
lines=0; total=0
将变量设置为 0lines++
lines
每行加一total+=$1
将每行中的值添加到运行总计中print total/lines
完成后,将总数除以值的数量另一种方式,使用
sed
andbc
:sed 表达式将输入转换为如下形式:
这是通过管道
bc
逐行评估它的。改编此 U&L 帖子中的 R 命令:
您可以在循环中使用
bc
基本计算器:while
read
或者更具可读性:
解释:
while read -r num; do ... ; done < timeMeasurements.txt
来做到这一点。这意味着我们将为文件的每一行做一些事情。((count++))
。$(...)
使用带有echo
管道的bash 命令替换bc
将文件这一行的 num 变量的值添加到所有先前行的 num 变量的总和。bc
被用作 bash 不能很好地处理浮点运算。至此循环结束,count变量包含时间测量值的数量,sum变量包含时间测量值的总和。
echo
来创建传递给的平均值计算bc
。该scale=2
部分说明bc
要显示多少有效数字。datamash 似乎是一个不错的选择,但即使承认我的回答可能有点矫枉过正,以防万一你想做的不仅仅是一个平均值,octave 也不是那么冗长:
如果您使用均值,请记住相同的均值可能来自非常不同的行为,因此标准差通常也是相关的:
甚至一个简单的直方图也很容易做到:
另外,我认为 datamash 不在 apt-get 存储库中以供信任,仅适用于较新版本。
编辑:
Oneliner,对于脚本更友好的用法: