패턴 일치 1 직전에 발생하는 패턴 일치 2 찾기

패턴 일치 1 직전에 발생하는 패턴 일치 2 찾기

다음과 같은 다른 패턴 앞에 표시할 패턴이 필요한 파일이 있습니다.

PAT1  
coord  
data  
data  
PAT1  
coord  
data  
data  
data  
PAT1  
coord  
data  
PAT2  
PAT1  
coord  
...

PAT1파일에는 항상 --> coord--> 스트림이 있지만 data항상 PAT2after 는 아닙니다 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두 패턴 모두 블록에 나타나지 않습니다.coordPAT1PAT2

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인쇄한 후 더 많은 정보를 찾고 싶다면 플래그를 재설정하여 대체할 수 있습니다.

관련 정보