Un awk
El programa es una serie de pares condición-acción, las condiciones están fuera de las llaves y las acciones están encerradas en ellas. Una condición se considera falsa si se evalúa como cero o como una cadena vacía, todo lo demás es verdadero (las variables no inicializadas son cero o una cadena vacía, según el contexto, por lo que son falsas). Puede implicarse una condición o una acción; se considera que las llaves sin condición (como comienza la suya) tienen una condición verdadera y siempre se ejecutan si se aciertan, y cualquier condición sin acción imprimirá la línea si y solo si se cumple la condición.
El 1
al final de su secuencia de comandos hay una condición (siempre verdadera) sin acción, por lo que ejecuta la acción predeterminada para cada línea, imprimiendo la línea (que puede haber sido modificada por la acción anterior entre llaves).
Realmente no me gustan estos tipos de atajos porque ofuscan y confunden cómo se analizan. Cuando lees algo como awk -F"=" '{OFS="=";gsub(",",";",$2)}1'
, podrías pensar que el 1
está modificando la declaración anterior. O podrías pensar 1
es un alias para {print}
, que no es técnicamente correcto.
En realidad, 1
es una declaración completamente separada. Puede separar las declaraciones de esta manera:
awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1
'
Cada formato de instrucción awk es condition {action}
. Si no hay {action}
dado, entonces la acción por defecto es {print}
. (Si no hay condition
dado, entonces la condición por defecto es true
.)
Así que aquí, 1
es la condición, que siempre se evalúa como true
ya que es distinto de cero. El action
se omite, por lo que el {print}
predeterminado es interpretado. Puedes pensarlo de esta manera:
awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1!=0 {print}
'
1
significa imprimir cada línea.
La instrucción awk es lo mismo que escribir:
awk -F"=" '{OFS="=";gsub(",",";",$2);print $0;}'