여러 행 형식이 있다고 가정해 보겠습니다.
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