2012-03-31 14 views
1

I私がやりたいどのような次のテキストファイルbashスクリプト

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

は、秒を含む行だけを解析し、それらを一緒に追加して、プリントアウトされてい最終結果。

どうすればいいですか?

ありがとうございます。

grep timesteps <file-name> | awk '{x += $4} END{printf("%.5f", x)}' 

変更し、お好みの出力精度にprintf文の数:

+0

私はbashをあまり知らない...!私が知っているのは、sedで正規表現を使う必要があることだけです。しかし、私はどのように考えている... – kstratis

答えて

2

awkは、このタイプの処理に適しています。

浮動小数点精度を処理するには、printfの書式文字列をそれぞれの変数に使用できます。

すべて評価さ変数のフォーマット文字列を設定し、別の方法があります。フォーマットは内部でsprintfを使用している(評価の際に適用される。制御ビルトイン変数がOFMTある。Built-in Variables That Control awkを参照してください。sedを使用して

#!/bin/bash 
file="$1" # $1 is the 1st command line parameter 
awk -vOFMT="%.6f" '/ took /{ secs+=$4 } END{ print secs }' "$file" 

それ自体を任意の計算を行うとさえbashことができないため、より複雑ですあなたはどのような場合にはawkまたはbcのようなものを使用する必要があるので、浮動小数点演算を行うことはできません

あなたが本当にsedを使用する場合:。

#!/bin/bash 
file="$1" # $1 is the 1st command line parameter 
{ sed -nr 's/.* took ([0-9.]+).*/\1+/p' "$file" |tr -d '\n'; echo 0; } |bc 
+0

私はクラフトンのソリューションを使用しましたが、あなたの説明が良くなりました!ありがとう! – kstratis

1

あなたは、単純なシェルコマンドを使用することができます。

+0

優秀!パラメータとしてを与えるにはどうすればいいですか? – kstratis

+0

私はうれしいです、私は助けることができます。申し訳ありませんが、私はあなたのコメントが遅すぎるのを見ました... – kraftan

1

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