假设我有一个文件:
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
你可以看到出了什么问题。
- 我该如何修复这个错误?
- 为什么会出现这个错误?
- 条件语句和条件块有什么区别?
答案1
在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
当条件为真1
且没有任何操作时,awk
默认行为为print
。print
不带参数将$0
默认打印。
答案2
第二个区块在
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
如果条件块匹配,这将导致跳过无条件块。