条件块与条件语句 (if)

Ook*_*ker 20 awk

说我有一个文件:

PRO 1
GLN 5.55112e-17
ILE -6.245e-17
THR 5.55112e-17
Run Code Online (Sandbox Code Playgroud)

我希望第二列中数字不等于 1 的每一行都将其更改为 0 并保留其余部分。

如果我使用if(即条件语句),一切正常:

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

但是当我使用条件块时,会发生一些不希望的事情:

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
Run Code Online (Sandbox Code Playgroud)

你可以看看有什么问题。

  • 我该如何解决这个错误?
  • 为什么会出现这个错误?
  • 条件语句和条件块有什么区别?

cuo*_*glm 30

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

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

一个简单的修复:

$ awk '$2!=1 {print $1,"0";next};{print $0}' file
PRO 1
GLN 0
ILE 0
THR 0
Run Code Online (Sandbox Code Playgroud)

你可以让它更简洁:

$ awk '$2 != 1 {print $1,"0";next};1' file
PRO 1
GLN 0
ILE 0
THR 0
Run Code Online (Sandbox Code Playgroud)

当条件为真1且没有动作时,awk默认行为是print。print没有参数将$0默认打印。

  • 你也可以把它打入`awk '$2!=1?$2=0:"";1' file`。 (4认同)

Kyl*_*nes 11

第二块在

awk '$2!=1 {print $1,"0"} {print $0}' file
Run Code Online (Sandbox Code Playgroud)

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

相反,写:

awk '$2!=1 {print $1,"0"} $2==1 {print $0}' file
Run Code Online (Sandbox Code Playgroud)

或者写:

awk '$2!=1 {print $1,"0"; next} {print $0}' file
Run Code Online (Sandbox Code Playgroud)

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