awk else-if 문이 두 번 실행되는 것 같습니다.

awk else-if 문이 두 번 실행되는 것 같습니다.

다음과 같은 작업을 수행하고 싶습니다.

1) 줄의 단어 수 = 1이면 단어를 인쇄합니다.

2) 줄의 단어 수가 > 3이면 네 번째 단어를 인쇄합니다.

3) 기타 모든 경우에는 빈 줄을 인쇄합니다.

입력 파일은,

cat file.txt
Hi there I welcome you
Hi there You
Hi
Hi there
Hi there I welcome you all

예상되는 출력은,

welcome

Hi

welcome

아래 코드를 사용하면 예상하지 못한 빈 줄이 추가로 출력됩니다.

cat file.txt | awk '{ if (NF>3) {print $4} else if (NF==1) {print $1} else {print "\n"} }'
welcome


Hi


welcome

다음 코드를 사용하여 이 문제를 해결했습니다.

cat file.txt | awk '{ if (NF>3) {print $4} else if (NF==1) {print $1} else {print $10000} }'
welcome

Hi

welcome

하지만 무엇이 잘못되고 있는지, 왜 else 문이 두 번 실행되고 예상치 못한 결과가 나오는지 알고 싶습니다.

답변1

print이는 명령문이 기본적으로 인쇄하는 문자열 끝에 개행 문자를 추가하기 때문입니다 . 이와 함께 사용하면 \n출력에서 ​​볼 수 있듯이 이중 개행 문자가 인쇄됩니다. printf대신 사용

awk '{ if (NF>3) {print $4} else if (NF==1) {print $1} else printf "\n" }' file

명시적인 분기 구조가 없으면 if..else if..else다음을 수행할 수 있습니다.

awk 'NF>3 { print $4; next } NF==1 { print $1; next } { printf "\n" }'

답변2

print명령은 항상 개행 문자를 추가합니다. 따라서 print "\n"지정한 개행 문자와 추가된 개행 문자를 인쇄합니다.

print ""또는 를 사용할 수 있습니다 printf "\n".

관련 정보