
以下のタスクを実行したいのですが、
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"
。