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".

관련 정보