다음과 같은 작업을 수행하고 싶습니다.
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"
.