我有以下文本文件
40 timesteps took 58.320842 seconds
greetings 0
80 timesteps took 58.048400 seconds
greetings 0
120 timesteps took 59.459687 seconds
greetings 0
我想要做的只是解析包含秒数的行,将它们加在一起并打印出最终结果。
我该怎么做?
提前谢谢。
答案 0 :(得分:3)
awk
非常适合此类处理。
要处理浮点精度,您可以对所涉及的每个变量使用printf
和 format-string 。
还有另一种方法可以为所有 评估的 变量设置格式字符串。格式化在评估期间应用(内部使用sprintf
。控制内置变量为OFMT
。请参阅Built-in Variables That Control awk。
#!/bin/bash
file="$1" # $1 is the 1st command line parameter
awk -vOFMT="%.6f" '/ took /{ secs+=$4 } END{ print secs }' "$file"
使用sed
更复杂,因为它无法进行任何计算,甚至bash
本身也无法进行浮点运算,因此您需要使用awk
或{{1}之类的内容无论如何。
如果你真的想使用sed:
bc
答案 1 :(得分:2)
您可以使用简单的shell命令:
grep timesteps <file-name> | awk '{x += $4} END{printf("%.5f", x)}'
将printf
语句中的数字更改为首选输出精度。
答案 2 :(得分:2)
awk解决方案是很好的答案。为了好玩,这是一个Ruby答案......
ruby -e 'puts readlines.inject(0) { |m, v| m += v.split[3].to_f }' < file
...或者......或者......
ruby -e 'puts readlines.map { |x| x.split[3].to_f }.reduce(&:+)' < file
...将文件作为参数传递给脚本...
#!/usr/bin/ruby
puts $<.map { |x| x.split[3].to_f }.reduce(&:+)