如何获取文件中写入的十进制值的平均值: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
答案 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
中的 旧信息,请参阅上面的<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
甚至将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