quelle est la signification de 1 à la fin du script awk

19

Je lisais ce script awk

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

Je veux savoir quelle est la fonction 1à la fin

Mirage
la source
Vous pourriez aussi faireawk -F"=" '{OFS="=";gsub(",",";",$2)}{print}'
GypsyCosmonaut

Réponses:

24

Un awkprogramme est une série de paires condition-action, les conditions étant en dehors des accolades et les actions qui y sont enfermées. Une condition est considérée comme fausse si elle est évaluée à zéro ou à la chaîne vide, tout le reste est vrai (les variables non initialisées sont nulles ou à chaîne vide, selon le contexte, elles sont donc fausses). Une condition ou une action peut être implicite; les accolades sans condition (comme la vôtre commence) sont considérées comme ayant une vraie condition et sont toujours exécutées si elles sont atteintes, et toute condition sans action imprimera la ligne si et seulement si la condition est remplie.

À 1la fin de votre script est une condition (toujours vraie) sans action, il exécute donc l'action par défaut pour chaque ligne, imprimant la ligne (qui peut avoir été modifiée par l'action précédente entre accolades).

Kevin
la source
7

Je n'aime vraiment pas ces types de raccourcis, car cela obscurcit et induit en erreur la façon dont il est analysé. Lorsque vous lisez quelque chose comme awk -F"=" '{OFS="=";gsub(",",";",$2)}1', vous pourriez penser que le 1modifie la déclaration précédente. Ou vous pourriez penser qu'il 1s'agit d'un alias {print}, qui n'est pas techniquement correct.

En fait, 1c'est une déclaration complètement distincte. Vous pouvez séparer les déclarations comme ceci:

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

Chaque format d'instruction awk est condition {action}. S'il n'y a pas de {action}donnée, alors l'action par défaut est {print}. (S'il n'y a pas de conditiondonnée, alors la condition par défaut est true.)

Voici donc 1la condition, qui est toujours évaluée truecar elle est non nulle. Le actionest omis, donc la valeur par défaut {print}est effectuée. Vous pouvez y penser de cette façon:

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

1 signifie imprimer chaque ligne.

L'instruction awk est identique à l'écriture:

awk -F"=" '{OFS="=";gsub(",",";",$2);print $0;}'
Gourou
la source