我想执行以下任务,
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"
。