awkを使用して正規表現の最初のインスタンスのみを取得する

awkを使用して正規表現の最初のインスタンスのみを取得する

.txt私のディレクトリには、双極子モーメントに関する情報を含む多くのファイルがあります。次のように進みます。

Dipole Moment: [D]
     X:     1.2808      Y:     0.2908      Z:     1.0187     Total:     1.6622
lorem ipsum
text 
that is 
not 
relevant 
Dipole Moment: [D]
     X:     1.2808      Y:     0.2908      Z:     1.0187     Total:     1.6622
more text

このファイルから総双極子モーメントを抽出したいと思います。次のスクリプトを実行しています。

awk '/Dipole Moment: \[D\]/{found=1;next} found{print $NF;found=""}' *.txt > dipole_bma.txt

スクリプトは1.6622を2回印刷します。すべての双極子モーメントは各ファイルに2回ずつ含まれていますTotal。正規表現がファイルに2回表示されるため、2回印刷されたようです。

私の質問は、各ファイルの合計双極子モーメントを一度だけ印刷するにはどうすればよいですか?

答え1

使用nextfile氏名:

awk '/Dipole Moment: \[D\]/{found=1;next} found{print $NF;nextfile;}' *.txt

答え2

Gnu sedは次のことができます:

sed -ns '
  /^Dipole Moment: \[D]/!d
  $!N;/\n/s/.* //p;:n;n;bn
' ./*.txt
  • -sオプション(nonPosix)はファイルを別々のストリームとして扱います。
  • -n次のレコードを取得するまでパターン空間のデフォルト印刷を抑制します。
  • 双極子モーメント線の後に、次の行をパターンスペースに貼り付けます。
  • 最後のスペースまで削除すると(末尾のスペースがないと仮定)、双極子モーメント値である最後のフィールドが印刷されます。
  • 次に、現在のファイルの終わりに移動します。次のファイルに対してプロセス全体を繰り返します。

関連情報