複数のファイルを処理すると、awkの範囲がリセットされます。

複数のファイルを処理すると、awkの範囲がリセットされます。

それぞれ次の内容を含むファイル1.txt2.txtがあるとしましょう。3.txt

foo1

Notes

foo2
bar

今私が配置した行を印刷したいと思います。後ろにパターンをNotesファイルの最後まで含めるか、fooパターンbarを含めます。これを達成するために、次のコマンドを実行します。

awk '/Notes/,/getline==0/ {if (/foo|bar/) {print}}' *txt

ただし、awkこの範囲は、2番目のファイルが処理されるとリセットされるようです。結果は次のとおりです(foo2合計項目のみを表示する必要があります)。bar

foo2
bar
foo1
foo2
bar
foo1
foo2
bar

明らかに私がそうするなら:

for i in $(*txt); do awk '/Notes/,/getline==0/ {if (/foo|bar/) {print}}' $i; done

...すべてが問題ありませんが、もちろん、awk各ファイルに対して新しいプロセスを開始したくないので、これは実際には解決策ではありません。

awk私の質問は、この検索範囲を/Notes/,/NR==0/マスク/グループ内のすべてのファイルに適用するにはどうすればよいですか?*txt

答え1

/getline==0/検索模様 getline==0、これは決して起こらないでしょう。

GNU awkがあればこれを行うことができます

gawk '/Notes/{notes=1} notes && /foo|bar/ {print} ENDFILE{notes=0}'

そうでなければ(もっと慣用的に)

awk 'FNR==1{notes=0} /Notes/{notes=1} notes && /foo|bar/'

関連情報