다음과 같은 텍스트 파일이 있다고 가정 해 봅시다.
R1 12 324 3453 36 457 4 7 8
R2 34 2342 2525 25 25 26 26 2 2
R3 23 2342 32 52 54 543 643 63
R4 25 234 2342 4 234242
awk
이 라인을 다르게 처리하는 데 사용 하고 싶습니다.
awk '/R1/ { print "=>" $0} /R2/ { print "*" $0} '
그리고 나머지 줄을 그대로 인쇄하고 싶습니다 (이미 처리 한 줄을 복제하지 않고), 기본적으로 줄 /ELSE/ { print $0}
끝에 필요합니다 awk
.
그런 것이 있습니까?
답변
간단한 접근 방식 awk
awk '/R1/ {print "=>" $0;next} /R2/{print "*" $0;next} 1' text.file
[jaypal:~/Temp] cat text.file
R1 12 324 3453 36 457 4 7 8
R2 34 2342 2525 25 25 26 26 2 2
R3 23 2342 32 52 54 543 643 63
R4 25 234 2342 4 234242
[jaypal:~/Temp] awk '/R1/ { print "=>" $0;next} /R2/{print "*" $0;next}1' text.file
=>R1 12 324 3453 36 457 4 7 8
*R2 34 2342 2525 25 25 26 26 2 2
R3 23 2342 32 52 54 543 643 63
R4 25 234 2342 4 234242
[jaypal:~/Temp]
패턴 {Action} 문 :
-
/R1/ { print "=>" $0;next}
: 이것은/R1/
인쇄 작업=>
이있는 행이 수행됨을 의미합니다.next
awk 문장의 나머지 부분은 무시되고 다음 줄을 볼 것임을 의미합니다. -
/R2/{print "*" $0;next}
: 이것은pattern /R2/
인쇄 작업과 일치하는 행이*
수행됨을 의미합니다. 때awk
시작 처리, 최초의pattern {action}
(가)로 문이 무시됩니다pattern /R1/
가진 라인을위한 진정한되지 않습니다/R2/
. 따라서 두 번째pattern {action}
진술은 라인에서 이루어집니다.next
다시 한 번 더 처리를 원하지 않으며awk
다음 줄로 넘어갑니다. -
1
모든 줄을 인쇄합니다. 조건없이 no가 제공{action}
되면 awk는 기본적으로를 사용{print}
합니다. 여기서 조건은1
참으로 해석되므로 항상 성공합니다. 우리가이 지점에 도착하면, 제 1 및 제 2 때문입니다pattern {action}
문이 무시되거나 (포함하지 않는 라인에 의해-전달 된/R1/
및/R2/
기본 인쇄 작업이 남아있는 라인에 대해 수행 할 수 있도록,).
답변
awk
조건부와 관련하여 일반적인 용의자를 구현합니다. 일치하고 싶은 일 printf
대신에 사용하는 것이 좋습니다 print
.
awk '{ if (/^R1/) { printf("=> %s\n", $0) } else if (/^R2/) { printf("* %s\n", $0) } else { print $0 } }'
답변
Chris Down은 블록에 명시적인 ‘if’문을 사용하여 정규 표현식에 대한 else를 얻는 방법을 이미 보여주었습니다. 그의 해결책이 더 나을 수도 있지만 다른 방법으로도 동일한 효과를 얻을 수 있습니다.
하나는 다른 것과 일치하지 않는 텍스트와 만 일치하는 세 번째 정규 표현식을 작성하는 것입니다.이 경우 다음과 같이 보일 것입니다.
awk '/^R1/ { print "=>" $0}
/^R2/ { print "*" $0}
/^[^R]/ || /^R[^12]/ { print $0 } '
이것은 고정 된 정규 표현식을 사용합니다-정규 표현식의 시작 부분에있는 ^는 줄의 시작 부분에서만 일치합니다-원래 패턴은이 작업을 수행하지 않았습니다. 다음 줄까지 건너 뜁니다. 세 번째 ( “else”)는 ‘R'([^ R])이 아닌 일부 문자로 시작하거나 ‘R’로 시작하고 그 뒤에 ‘1’또는 ‘이 아닌 문자가 오는 행과 일치합니다. 2 ‘(R [^ 12]). ^의 두 가지 다른 의미는 다소 혼란 스럽지만 그 실수는 오래 전에 만들어졌으며 곧 바뀌지 않을 것입니다.
보완 정규 표현식을 사용하려면 실제로 고정해야합니다. 그렇지 않으면 [^ R]이 뒤에 오는 1과 일치합니다. 매우 간단한 정규식의 경우이 방법이 유용 할 수 있지만 정규식이 복잡해지면이 방법을 관리 할 수 없게됩니다. 대신 다음과 같이 각 줄에 상태 변수를 사용할 수 있습니다.
awk '{ handled = 0 }
/^R1/ { print "=>" $0; handled = 1}
/^R2/ { print "*" $0; handled = 1}
{ if (!handled) print $0 } '
이렇게하면 각 줄 바꿈마다 처리 된 값이 0으로 설정되고 두 정규 표현식 중 하나와 일치하면 1로 설정되고 마지막으로 여전히 0 인 경우 $ 0 인쇄를 실행합니다.