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" }'

おすすめ記事