awk는 두 패턴과 일치하는 행을 추출하며 둘 다 참입니다.

awk는 두 패턴과 일치하는 행을 추출하며 둘 다 참입니다.

다음 조건과 일치하지만 두 조건이 모두 true인 경우에만 행을 인쇄하도록 아래 코드를 어떻게 변경할 수 있습니까?

추출해야 하는 행은 다음 기준을 충족해야 합니다.
즉, 패턴b 조건을 충족하는 행이 발견되면 패턴a와 일치하는 행만 인쇄합니다.

awk '/patterna/ || /patternb/ { print > "patternapatternb.txt" }' inputfile

입력 파일
모드 a 이
모드 b 해당
모드 a
다른
모드
모드 a 다른 이
모드 b 다른 모드

출력 패턴apatternb.txt:
패턴a 이
패턴b 그
패턴a 다른 이 패턴nb
또 다른 패턴

각 쌍의 출력을 다른 파일에 쓸 수 있도록 다중 쌍 모드에 대해 이를 구현하는 방법

답변1

awk각 레코드를 별도로 처리합니다(기본적으로 레코드는 행임). 인접한 행에 걸쳐 조건을 적용하려면 이 getline함수를 사용하여 다음 레코드를 읽고 두 번째 패턴에 대해 테스트할 수 있습니다.

awk '/patterna/ { 
  a=$0
  if (getline > 0 && $0 ~ /patternb/) {
    print a
    print
  }
}' inputfile

또는 다음을 사용하는 것을 고려할 수 있습니다.sed

sed -n '/patterna/ {$!N; /\npatternb/p}' inputfile

/patternb/일치할 때마다 첫 번째 일치 항목을 인쇄 하려면 앞에 를 입력하고 다음 을 수행하면 됩니다./patterna//patterna/상태 저장파서는 일치하는 항목마다 플래그를 설정 /patterna/하고 일치하는 항목마다 플래그를 설정 해제하여 이를 수행합니다 /patternb/.

awk '
  /patterna/ {
    a=1; lasta=$0; next;
  } 
  /patternb/ && a==1 {
     a=0; print lasta; print;
  }' inputfile

답변2

매우 깨끗한 솔루션 사용 중TxR, 출력 이외의 명시적인 상태 작업이나 부작용은 없습니다.

@(repeat)
patterna @this
@  (repeat)
patterna @other
@    (fail)
@  (last :mandatory)
patternb @that
@  (end)
@  (output)
patterna @this
patternb @that
@  (end)
@(end)

달리기:

$ txr pairs.txr data
patterna this
patternb that
patterna anotherthis
patternb anotherthat

이 솔루션에서는 다음 요구 사항을 포착하려고 합니다. patternbwith 줄 뒤에서 키워드를 찾으세요 patterna. 바로 뒤에 오는 줄일 필요는 없습니다. 그러나 patternb이는 다음을 갖는 다른 행 앞에 발생해야 합니다 . patterna지정된 patterna행과 해당 행과 일치하는 쌍 patternb사이에 다른 행이 있을 수 없습니다 patterna.

내부 반복:

@  (repeat)
patterna @other
@    (fail)
@  (last :mandatory)
patternb @that
@  (end)

입력을 스캔하여 다음 두 가지 항목을 찾습니다. 일치

patterna @other

또는 강제 매칭 종료

patternb @that

그러나 patterna @other발견된 경우 바로 다음 명령이 실행되면 @(fail)반복적인 실패가 발생합니다. (반복하면 암시적 블록이 빌드되고 @(block)가장 @(fail)안쪽을 둘러싸는 블록이 일치 실패로 종료됩니다.)

답변3

좋아, 더 포괄적인 설명을 바탕으로 pcregrep을 사용할 수 있습니다

pcregrep -M 'patterna(.*\n)patternb' inputfile > patternapatternb.txt

이 한 줄짜리 내용은 당신에게 줄 것입니다

cat patternapatternb.txt
patterna this
patternb that
patterna another this
patternb another that

이전 답변

이 한 줄의 코드를 사용했습니다 ...

 awk '/patterna/ && /patternb/ {print > "patternapatterb.txt" } ' inputfile

이 입력 파일

cat inputfile
patterna    patternb    this
patterna    patterna    that

밝혀지다

cat patternapatterb.txt
patterna    patternb    this

이것이 바로 귀하께서 요청하신 내용인 것 같습니다(귀하께서 "그러나 둘 다 사실인 경우에만"이라고 말씀하셨습니다). 그러나 귀하의 요청을 잘못 이해한 경우 알려 주시기 바랍니다.

패턴a 또는 패턴b와 일치시키려면 egrep을 사용할 수 있습니다.

 egrep "patterna||patternb" inputfile > patternapatternb.txt

관련 정보