다음과 같은 다른 패턴 앞에 표시할 패턴이 필요한 파일이 있습니다.
PAT1
coord
data
data
PAT1
coord
data
data
data
PAT1
coord
data
PAT2
PAT1
coord
...
PAT1
파일에는 항상 --> coord
--> 스트림이 있지만 data
항상 PAT2
after 는 아닙니다 data
. 원하는 출력: coord
-- PAT2와 바로 앞의 PAT1 사이의 출력입니다.
즉, 예상되는 출력은 다음과 같아야 합니다.
coord
주어진 예에는 PAT2가 하나만 있기 때문입니다.
이 사이트와 다른 사이트에서 수많은 질문과 답변을 살펴봤지만 정확한 내용을 찾을 수 없습니다. 예를 들어:
모든 PAT1에 PAT2가 있으면 좋을 것입니다.
https://stackoverflow.com/questions/38972736/how-to-print-lines- Between-two-patterns-inclusive-or-exclusive-in-sed-awk-or/38972737#38972737
coord
이 답변은 PAT2-에 특정 수의 줄이 있는 경우 편리할 것입니다.
awk는 다른 일치 항목 이전의 마지막 레코드인 경우에만 일치 항목을 인쇄합니다.
등.
어떤 조언이라도 대단히 감사하겠습니다. 나는 어떤 방법(sed, awk, grep 등)에도 열려있습니다.
답변1
보다 대표적인 입력 예는 인쇄하려는 출력 줄을 식별하는 줄 번호와 동일합니다.
> nl file
1 PAT1
2 coord
3 data
4 data
5 PAT1
6 coord
7 data
8 data
9 data
10 PAT1
11 coord
12 data
13 PAT2
14 PAT1
15 coord
이 명령은 과 사이에 있는 경우에만 패턴이 포함된 행을 인쇄하며 awk
두 패턴 모두 블록에 나타나지 않습니다.coord
PAT1
PAT2
awk '/PAT1/{f=1; p=""} p && /PAT2/{print p; exit} f && /coord/{p=$0}' <(nl file)
11 coord
f
일치하는 항목이 PAT1
발견되었음을 나타내는 데 사용되며, 이 플래그는 coord
후속 일치 항목을 활성화하는 데 사용됩니다. p
발견된 각 콘텐츠도 지워 PAT1
지므로 유사한 상황에서는 아무 것도 인쇄되지 않습니다 PAT1 coord PAT1 text PAT2
.
또한, exit
인쇄한 후 더 많은 정보를 찾고 싶다면 플래그를 재설정하여 대체할 수 있습니다.