使用bash取十进制数的平均值

时间:2011-06-30 16:29:40

标签: linux bash sed awk grep

如何获取文件中写入的十进制值的平均值:TestFile为

Time to write: 0.000118000 sec

Time to write: 0.000119000 sec

Time to write: 0.000122000 sec

错误的Soln:

以下打印仅为零,即0

awk '{sum+=$7}END{print sum/NR}' TestFile

2 个答案:

答案 0 :(得分:3)

修改

因为你遇到了麻烦,并且似乎返回零尝试使用此

grep -oP "\d+\.\d+" testFile | awk -vx=0 '{x += $1} END {print x/NR}'

如果文件是双倍间隔,这将起作用。它只打印具有十进制数的文件的匹配项。并将其发送给awk。

-P标志是perl正则表达式。您可以使用-E执行相同操作,但\d+匹配一个或多个数字,\.匹配句点。一个 。在正则表达式中有特殊含义,需要进行转义,\d+匹配一个或多个数字,因此将它们放在一起,'\d+\.\d+',您有一个小数。

最后,如果你继续得到科学记数法,你可以考虑使用printf来实现浮点数

awk -vx=0 '{x += $4} END { printf ("%8.9f", x/NR) } testFile'

你可以指定像“%4.3f”这样小的东西,在十分之一后只打印4个数字,相反,使用%e以科学记数法打印

awk

中的

More using printf


旧信息,请参阅上面的<hr>

awk -vx=0 '{x += $4} END {print x/NR}' testFile

输出:

  

0.000119667

每行的

追加$ 4,在你的测试文件中是x的数字。最后将x除以行数。

如果您的文件实际上是双倍间距,请先执行以下操作:

sed -i '/^$/d' testFile删除空行。您可能要考虑不删除-i并执行类似sed '/^$/d' testFile > newFile

之类的操作来编辑testFile

甚至将sed中的两个文件和管道标准输出合并到awk

sed '/^$/d' testFile | awk -vx=0 '{x += $4} END {print x/NR}'

如果返回0,则可能是testFile有问题。

答案 1 :(得分:3)

此解决方案将以正确的行计算目标:

awk '/Time to write/ {sum+=$4; count++} END {print "avg:", sum/count}' data.txt