Digamos que tengo un archivo:
PRO 1
GLN 5.55112e-17
ILE -6.245e-17
THR 5.55112e-17
Quiero que cada línea que tenga un número desigual a 1 en la segunda columna cambie a 0 y conserve el resto.
Si uso if
(es decir, declaración condicional), todo está bien:
awk '{if($2!=1){print $1,"0"}else{print $0}}' file
PRO 1
GLN 0
ILE 0
THR 0
Pero cuando uso el bloque condicional, sucede algo no deseado:
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
Puedes ver lo que está mal.
- ¿Cómo soluciono este error?
- ¿Por qué ocurre este error?
- ¿Cuál es la diferencia entre una declaración condicional y un bloque condicional?
awk '$2!=1?$2=0:"";1' file
.next
. Supongo que suprime la segunda impresión si la primera es verdadera. Algo así comocontinue
enC
.next
suprime el procesamiento de la línea de entrada actual, salte a la siguiente. El mismo papel quewhile
, pero para todo elawk
programa. Además,awk
tiene su propiowhile
El segundo bloque en
no es condicional Se actúa sobre cada línea y, por lo tanto, imprime cada línea.
En cambio, escribe:
O escribe:
Esto hará que se omita el bloque incondicional, si el bloque condicional coincide.
fuente