awk else-if 語句似乎執行了兩次

awk else-if 語句似乎執行了兩次

我想執行以下任務,

1) 若行字數 = 1 則列印單字

2)若行字數> 3,則列印第4個字

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"

相關內容