Digamos que eu tenho um arquivo:
PRO 1
GLN 5.55112e-17
ILE -6.245e-17
THR 5.55112e-17
Eu quero que cada linha que tenha um número diferente de 1 na segunda coluna mude para 0 e mantenha o resto.
Se eu usar if
(ou seja, declaração condicional), está tudo bem:
awk '{if($2!=1){print $1,"0"}else{print $0}}' file
PRO 1
GLN 0
ILE 0
THR 0
Mas quando eu uso o bloco condicional, algo indesejado acontece:
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
Você pode ver o que está errado.
- Como corrijo esse erro?
- Por que esse erro ocorre?
- Qual é a diferença entre uma declaração condicional e um bloco condicional?
awk '$2!=1?$2=0:"";1' file
.next
. Acho que suprime a segunda impressão, se a primeira for verdadeira. Algo comocontinue
emC
.next
suprime a linha de entrada atual de processamento, pule para a próxima. O mesmo papel quewhile
, mas para todo oawk
programa. Além disso,awk
tem o seu própriowhile
O segundo bloco em
não é condicional. Ele é acionado para cada linha e, assim, imprime todas as linhas.
Em vez disso, escreva:
Ou escreva:
Isso fará com que o bloco incondicional seja pulado, se o bloco condicional for correspondido.
fonte