条件付きブロックと条件文(if)

条件付きブロックと条件文(if)

ファイルがあるとしましょう。

PRO 1
GLN 5.55112e-17
ILE -6.245e-17
THR 5.55112e-17

2番目の列の数字が1以外のすべての行を0に変更し、残りを維持したいと思います。

if条件文などを使用すると、すべてがうまく機能します。

awk '{if($2!=1){print $1,"0"}else{print $0}}' file
PRO 1
GLN 0
ILE 0
THR 0

しかし、条件付きブロックを使用すると、望ましくないことが起こります。

awk '$2!=1 {print $1,"0"} {print $0}' file
PRO 1
GLN 0
GLN 5.55112e-17
ILE 0
ILE -6.245e-17
THR 0
THR 5.55112e-17

何が間違っているかを見ることができます。

  • このエラーをどのように解決できますか?
  • このエラーはなぜ発生しますか?
  • 条件文と条件ブロックの違いは何ですか?

ベストアンサー1

ifステートメントに一致するものがない場合は、elseそのブランチを実行します。ifelse

条件文では、条件が真であるか偽であるかに関係なく、両方の操作が実行されます。

簡単な修正:

$ awk '$2!=1 {print $1,"0";next};{print $0}' file
PRO 1
GLN 0
ILE 0
THR 0

より簡潔にすることもできます。

$ awk '$2 != 1 {print $1,"0";next};1' file
PRO 1
GLN 0
ILE 0
THR 0

デフォルトの動作は、条件が真であり、1何もしない場合です。パラメータがない場合はデフォルトで印刷されます。awkprintprint$0

おすすめ記事