Estaba leyendo este guión awk
awk -F"=" '{OFS="=";gsub(",",";",$2)}1'
Quiero saber cuál es la función 1
al final
Estaba leyendo este guión awk
awk -F"=" '{OFS="=";gsub(",",";",$2)}1'
Quiero saber cuál es la función 1
al final
Respuestas:
Un awk
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 a cero o la cadena vacía, cualquier otra cosa es verdadera (las variables no inicializadas son cero o cadena vacía, dependiendo del contexto, por lo que son falsas). Se puede implicar una condición o una acción; los frenos sin una condición (cuando comienza la suya) se considera que tienen una condición verdadera y siempre se ejecutan si se golpean, y cualquier condición sin una acción imprimirá la línea si y solo si se cumple la condición.
El 1
final de su script es 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 ofusca y confunde cómo se analiza. Cuando lees algo así awk -F"=" '{OFS="=";gsub(",",";",$2)}1'
, podrías pensar que 1
está modificando la declaración anterior. O podría pensar que 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 declaración awk es condition {action}
. Si no se {action}
da, la acción predeterminada es {print}
. (Si no se condition
da, entonces la condición predeterminada es true
).
Entonces, aquí 1
está la condición, que siempre se evalúa true
ya que no es cero. Se action
omite, por lo que {print}
se realiza el valor predeterminado . Puedes pensarlo de esta manera:
awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1!=0 {print}
'
awk -F"=" '{OFS="=";gsub(",",";",$2)}{print}'