여러 파일을 처리할 때 awk의 범위가 재설정됩니다.

여러 파일을 처리할 때 awk의 범위가 재설정됩니다.

각각 다음 내용을 포함하는 파일 1.txt2.txt가 있다고 가정해 보겠습니다 .3.txt

foo1

Notes

foo2
bar

이제 내가 배치한 라인을 인쇄하고 싶습니다.뒤쪽에패턴을 Notes파일 끝까지 포함하며 foo또는 bar패턴을 포함합니다. 이를 달성하기 위해 다음 명령을 실행합니다.

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

그러나 awk이 범위는 두 번째 파일이 처리되면 재설정되는 것으로 보입니다. 결과는 다음과 같습니다( 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/'

관련 정보