Ich habe dieses awk-Skript gelesen
awk -F"=" '{OFS="=";gsub(",",";",$2)}1'
Ich möchte wissen, was die Funktion 1
am Ende davon ist
Ich habe dieses awk-Skript gelesen
awk -F"=" '{OFS="=";gsub(",",";",$2)}1'
Ich möchte wissen, was die Funktion 1
am Ende davon ist
Antworten:
Ein awk
Programm besteht aus einer Reihe von Bedingungs-Aktions-Paaren, wobei Bedingungen außerhalb von geschweiften Klammern und Aktionen darin eingeschlossen sind. Eine Bedingung wird als falsch betrachtet, wenn sie als Null oder als leere Zeichenfolge ausgewertet wird, alles andere ist wahr (nicht initialisierte Variablen sind je nach Kontext Null oder leere Zeichenfolge, also falsch). Es kann entweder eine Bedingung oder eine Aktion impliziert werden. Klammern ohne Bedingung (wie Ihre beginnen) gelten als echte Bedingung und werden immer ausgeführt, wenn sie getroffen werden. Bei jeder Bedingung ohne Aktion wird die Zeile genau dann gedruckt, wenn die Bedingung erfüllt ist.
Das 1
Ende Ihres Skripts ist eine Bedingung (immer wahr) ohne Aktion, daher führt es die Standardaktion für jede Zeile aus und gibt die Zeile aus (die möglicherweise durch die vorherige Aktion in geschweiften Klammern geändert wurde).
Ich mag solche Verknüpfungen wirklich nicht, weil sie die Art und Weise, wie sie analysiert werden, verschleiern und in die Irre führen. Wenn Sie so etwas lesen awk -F"=" '{OFS="=";gsub(",",";",$2)}1'
, denken Sie vielleicht, dass 1
die vorherige Anweisung geändert wird. Oder Sie denken vielleicht, es 1
handelt sich um einen Alias für {print}
, der technisch nicht korrekt ist.
In Wirklichkeit 1
handelt es sich um eine völlig separate Aussage. Sie können die Anweisungen wie folgt trennen:
awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1
'
Jedes awk-Anweisungsformat ist condition {action}
. Wenn dies nicht {action}
angegeben ist, lautet die Standardaktion {print}
. (Wenn dies nicht condition
angegeben ist, lautet die Standardbedingung true
.)
Hier 1
ist also die Bedingung, die immer true
als ungleich Null ausgewertet wird. Das action
wird weggelassen, so dass der Standard {print}
durchgeführt wird. Sie können sich das so vorstellen:
awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1!=0 {print}
'
awk -F"=" '{OFS="=";gsub(",",";",$2)}{print}'