Réponses:
Un awk
programme 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.
À 1
la 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).
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 1
modifie la déclaration précédente. Ou vous pourriez penser qu'il 1
s'agit d'un alias {print}
, qui n'est pas techniquement correct.
En fait, 1
c'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 condition
donnée, alors la condition par défaut est true
.)
Voici donc 1
la condition, qui est toujours évaluée true
car elle est non nulle. Le action
est 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}
'
awk -F"=" '{OFS="=";gsub(",",";",$2)}{print}'