ファイルがあるとします:
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