Bloqueio condicional vs declaração condicional (se)

14

Digamos que eu tenha um arquivo:

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

Eu quero que cada linha com um número diferente de 1 na segunda coluna mude para 0 e mantenha o restante.

Se eu usar if (ou seja, declaração condicional), tudo está OK:

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 uma bloqueio condicional?
por Ooker 10.07.2014 / 02:03

2 respostas

19

Em uma declaração if , você tem um else . Se if não corresponder, a ramificação else será executada.

Em uma declaração condicional, ambas as ações são executadas, independentemente da condição ser verdadeira ou falsa.

Uma correção simples:

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

E você pode torná-lo mais conciso:

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

Quando a condição é verdadeira 1 e não há ação, o comportamento padrão awk é print . print sem argumento imprimirá $0 por padrão.

    
por 10.07.2014 / 02:09
10

O segundo bloco em

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

não é condicional. Ele é usado para cada linha e, portanto, imprime todas as linhas.

Em vez disso, escreva:

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

Ou escreva:

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

Isso fará com que o bloco incondicional seja ignorado, se o bloco condicional for correspondido.

    
por 10.07.2014 / 02:09

Tags