다음 조건과 일치하지만 두 조건이 모두 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
이 솔루션에서는 다음 요구 사항을 포착하려고 합니다. patternb
with 줄 뒤에서 키워드를 찾으세요 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