条件付きブロックと条件付きステートメント(if)

ファイルがあるとします:

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

2番目の列に1以外の番号があるすべての行で、0に変更し、残りを保持する必要があります。

ifを使用する場合(つまり、条件文)、すべてOKです:

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 

何が問題なのかがわかります。

  • このエラーを修正するにはどうすればよいですか?
  • このエラーが発生するのはなぜですか?
  • 条件ステートメントと条件ブロックの違いは何ですか?

回答

ifステートメント、elseがあります。 ifが一致しない場合、elseブランチが実行されます。

条件ステートメントでは、両方のアクションは次のようになります。条件がtrueかfalseかに関係なく、実行されます。

簡単な修正:

$ 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 

条件がtrue 1でアクションがない場合、awkのデフォルトの動作はprintです。引数のないprintは、デフォルトで$0を出力します。

コメント

  • awk '$2!=1?$2=0:"";1' fileにゴルフすることもできます。
  • @ terdon:良いゴルフ。OPがそれを理解するのは難しいかもしれないと思います。
  • @cuonglmはnextの役割を説明していただけますか。最初の出力がtrueの場合、2番目の出力。Ccontinueのようなもの。
  • @Alexander Cska:nextは現在の入力行の処理を抑制します。次の入力行にスキップしてください。 whileと同じ役割ですが、awkプログラム全体を対象としています。また、awkには独自のwhile

回答

awk "$2!=1 {print $1,"0"} {print $0}" file 

の2番目のブロックは条件付きではありません。すべての行に対して処理されるため、すべての行が出力されます。行。

代わりに、次のように記述します。

awk "$2!=1 {print $1,"0"} $2==1 {print $0}" file 

または次のように記述します:

awk "$2!=1 {print $1,"0"; next} {print $0}" file 

これにより、条件付きブロックが一致した場合、無条件ブロックがスキップされます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です