ファイルがあるとします:
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 {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
これにより、条件付きブロックが一致した場合、無条件ブロックがスキップされます。
awk '$2!=1?$2=0:"";1' file
にゴルフすることもできます。next
の役割を説明していただけますか。最初の出力がtrueの場合、2番目の出力。C
のcontinue
のようなもの。next
は現在の入力行の処理を抑制します。次の入力行にスキップしてください。while
と同じ役割ですが、awk
プログラム全体を対象としています。また、awk
には独自のwhile