awkまたはsedを使用してパターン発生(リモート冗長行)から選択的に抽出

awkまたはsedを使用してパターン発生(リモート冗長行)から選択的に抽出

ファイルには、数字を含まない行が 2 回表示される行パターンがあります。

Energy initial, next-to-last, final = 
 -87057.8200168321  -87208.7223900015  -87208.7197287879
Energy initial, next-to-last, final = 
 -87208.7197287879  -87208.7223900015  -87310.7197287879

-87310.7197287879数字を含まない行が2番目に表示された後、行の末尾にある値を抽出したいと思います。

awkまたはSedを使用してこれをどのように実行できますか?

答え1

awk '/^Energy initial, next-to-last, final =/ 
    { if (secondline==0) { secondline=1; next; } else { getline; print $3; } }' inputfile

-87310.7197287879

答え2

ファイルにこのパターンが1つ以上ある場合、他のアプローチは次のとおりです。

$ awk '/^Energy initial, next-to-last, final =/ {a[NR]=1} 
       {if(NR >= 3 && a[NR-2] == a[NR] && a[NR] == 1) {toprint=1; next}}
       {if (toprint) {print $3; toprint=0}}' infile

それにもかかわらず、Haukeのソリューションははるかに醜いです。

答え3

ちょっと待ってください:

> awk '{print $3}' /tmp/test.txt | grep -m1 -vE '[a-z]'
-87208.7197287879

このawkコマンドは3番目の項目($3)を印刷し、/tmp/test.txtgrepの操作を行います。いいえ[a-z]テキストのある行を削除し()、選択した行の1つ-m1の後に停止するすべての文字と一致します()

関連情報