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"

相关内容