¿Cuál es el significado de 1 al final del script awk?

19

Estaba leyendo este guión awk

awk -F"=" '{OFS="=";gsub(",",";",$2)}1'

Quiero saber cuál es la función 1al final

Randhir Singh
fuente
También podrías hacerloawk -F"=" '{OFS="=";gsub(",",";",$2)}{print}'
GypsyCosmonaut

Respuestas:

24

Un awkprograma 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 1final 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).

Kevin
fuente
7

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 1está modificando la declaración anterior. O podría pensar que 1es un alias para {print}, que no es técnicamente correcto.

En realidad, 1es 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 conditionda, entonces la condición predeterminada es true).

Entonces, aquí 1está la condición, que siempre se evalúa trueya que no es cero. Se actionomite, por lo que {print}se realiza el valor predeterminado . Puedes pensarlo de esta manera:

awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1!=0 {print}
'
Wisbucky
fuente
5

1 significa imprimir cada línea.

La declaración awk es lo mismo que escribir:

awk -F"=" '{OFS="=";gsub(",",";",$2);print $0;}'
Gurú
fuente