2012-01-27 8 views
3

下に数を6行をgrabing Iは、最終結果がセットに対するこれらの値の平均を示すパターン

       FINAL RESULTS 



    NSTEP  ENERGY   RMS   GMAX   NAME NUMBER 
    1000  -4.7910E+01  2.1328E-01  9.4193E-01  C   62 

を繰り返し、これらの線を有します。出力ファイルには、1000個のすべてのセットが含まれています。私はエネルギー以下の数(-4.7910E + 01)を取得する必要があり、1000個全てを別のファイルに入れます。 NSTEP、ENERGY、RMSなどの他のパタ​​ーンが何百万も繰り返されているため、パターンとして最終結果を設定する必要があります。

私は何か助けに感謝します。

+0

私はこのことについてはっきりしていません。あなたは「ENERGY」の下のすべての* 1,000行を望んでいますか? – Kevin

+0

ファイルには数千種類あります。私はENERGYより1000以下の数字が必要です。 –

+0

ああ、私は思うよ、 '最終結果\ n ... ENERGY \ n ...'パターン全体が繰り返されますか? – Kevin

答えて

6

このような何かがあなたのために働く必要があります。

awk '/FINAL RESULTS/{for (i=0; i<5; i++) getline; print $2}' <filename> 
+0

これは、単一の値だけを出力します。 – potong

+0

@potongご意見ありがとうございます。私は複数の値でそれをテストし、うまくいった。期待される結果をもたらさない入力例を教えてください。 – jcollado

+0

私はあなたに謝罪しています。私は、「ENERGY」に1000行の「最終結果」があったわけではないことを考えました。 – potong

3

いいえ、私は今見ていると思います。

awk 'found==1 { print $2; found=0 } $2=="ENERGY" { found=1 }' inputfile 

これは関係なく、それとの間FINAL RESULTSがある何行のENERGY以下の数を取得します。

+0

これは、 "FINAL RESULTS"パターンを使用しないので、他のセクション( "NSTEP"など)では "ENERGY"の値を出力します。 –

0

これはあなたのために働くかもしれない:

awk '/FINAL RESULTS/{f=1;p=0}{p++}f==1 && p==6{print $2}' file 

それともあなたが好きな場合:

GNU grep
awk 'f==2 && p==1{print $2}{p++}/FINAL RESULTS/{f=1}/ENERGY/ && f==1{f=2;p=0}' file 
0

(およびいくつかの他の拡張機能に続くもの)は、grep -A 6 'FINAL RESULTS'

これはLinuxで動作するはずです。最近のMacOS Xで動作することがわかりました。私はFreeBSDでこれを使用していると確信しています。したがって、おそらく遭遇するUNIXのほとんどの形式で動作します。 (もしそうでなければ、GNU "coreutils"パッケージをインストールしてください)。