Awk else-if 文が 2 回実行されているようです

Awk else-if 文が 2 回実行されているようです

以下のタスクを実行したいのですが、

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"

関連情報