AWK 패턴-코드-블록 구문: AWK에서 코드 블록을 패턴별로 실행하는 방법은 무엇입니까?

AWK 패턴-코드-블록 구문: AWK에서 코드 블록을 패턴별로 실행하는 방법은 무엇입니까?

여러 행 형식이 있다고 가정해 보겠습니다.

this:foo ...
that: foo ...

한 양식 또는 다른 양식에 대해 두 가지 다른 루틴을 실행하고 싶습니다.

cat text_file \
| awk -F ':' '/:foo/ { # do this } # else print the whole line unchanged' 
| awk -F ':' '/ +foo +/ { # do that } # else print the whole line unchanged'

이상적으로는 다음과 같이 작성할 수 있습니다.

cat text_file \
| awk -F ':' '
   /:foo/ { ... }
   / +foo +/ { ... } 
   ...
   /.*/ { print }
'

하지만 상황은 내가 예상했던 것과는 매우 다르게 흘러가는 것 같았다. 이를 수행하는 특별한 방법이 있습니까?

답변1

넌 할 수있어:

awk '
    /:foo/ { print "do-things"; next }
    /[[:blank:]]+foo[[:blank:]]+/ { print "do-some-other-things"; next }
    { print "do-else" }
' infile

우리가 사용하는 명령문에 주목하세요 next. 즉, 주어진 블록의 조건이 true이면 나머지 코드를 실행하기 위해 점프합니다. 위의 두 블록 조건 중 어느 것도 충족되지 않으면 마지막 블록이 실행됩니다.

답변2

내 생각엔 당신이 원하는 것:

awk -F: '
    $2 ~ /^[[:blank:]]/ {
        print "2nd field start with space"
    }
    $2 == "" || $2 ~ /^[^[:blank:]]/ {
        print "2nd field does not start with space"
    }
    { print }
' text_file

관련 정보