条件块与条件语句(如果有)


18

说我有一个文件:

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

我希望第二列中数字不等于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

您可以看到问题所在。

  • 如何解决此错误?
  • 为什么会发生此错误?
  • 条件语句和条件块之间有什么区别?

Answers:


26

if声明中,您有一个else。如果if不匹配,else则执行分支。

在条件语句中,无论条件为真还是假,两个动作都将执行。

一个简单的解决方法:

$ 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默认行为为printprint没有参数将$0默认打印。


4
您也可以打高尔夫awk '$2!=1?$2=0:"";1' file
terdon

@terdon:打高尔夫球很好。我认为OP可能很难理解。
cuonglm 2014年

1
@cuonglm您能否解释的作用next。我猜如果第一个是正确的,它将抑制第二个打印。喜欢的东西continueC
亚历山大·斯卡

@Alexander Cska:next取消处理当前输入行,跳至下一行。与的角色相同while,但适用于整个awk程序。此外,awk有自己的while
cuonglm

10

在第二块

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

不是有条件的。它作用于每一行,因此打印每一行。

相反,写:

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

或写:

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

如果条件块匹配,将导致无条件块被跳过。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.