次のようなことをしたいと思います。
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ステートメントが2回実行され、予期しない結果が出るのかを知りたいです。
答え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"
。