用于解析和处理文本文件的特定行的Bash脚本

时间:2012-03-31 20:22:46

标签: bash text

我有以下文本文件

40 timesteps took 58.320842 seconds
greetings 0
80 timesteps took 58.048400 seconds
greetings 0
120 timesteps took 59.459687 seconds
greetings 0

我想要做的只是解析包含秒数的行,将它们加在一起并打印出最终结果。

我该怎么做?

提前谢谢。

3 个答案:

答案 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(&:+)