Ein awk
Programm ist eine Reihe von Bedingungs-Aktions-Paaren, wobei Bedingungen außerhalb von geschweiften Klammern stehen und Aktionen darin eingeschlossen sind. Eine Bedingung gilt als falsch, wenn sie Null oder eine leere Zeichenfolge ergibt, alles andere ist wahr (nicht initialisierte Variablen sind je nach Kontext null oder eine leere Zeichenfolge, also sind sie falsch). Es kann entweder eine Bedingung oder eine Aktion impliziert werden; geschweiften Klammern ohne Bedingung (wie Ihre beginnt) gelten als wahre Bedingung und werden immer ausgeführt, wenn sie getroffen werden, und jede Bedingung ohne Aktion druckt die Zeile nur dann, wenn die Bedingung erfüllt ist.
Die 1
am Ende Ihres Skripts ist eine Bedingung (immer wahr) ohne Aktion, also 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 diese Art von Abkürzungen wirklich nicht, weil sie verschleiern und irreführen, wie sie analysiert werden. Wenn Sie etwas wie awk -F"=" '{OFS="=";gsub(",",";",$2)}1'
lesen , könnten Sie denken, dass die 1
ändert die vorherige Aussage. Oder Sie denken vielleicht an 1
ist ein Alias für {print}
, was technisch nicht korrekt ist.
Eigentlich 1
ist eine ganz eigene Aussage. Sie können die Anweisungen wie folgt trennen:
awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1
'
Jedes awk-Anweisungsformat ist condition {action}
. Wenn es kein {action}
gibt gegeben, dann ist die Standardaktion {print}
. (Falls kein condition
vorhanden ist gegeben, dann ist die Standardbedingung true
.)
Also hier, 1
ist die Bedingung, die immer zu true
ausgewertet wird da es nicht null ist. Die action
wird weggelassen, daher der Standardwert {print}
ist durchgeführt. Sie können sich das so vorstellen:
awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1!=0 {print}
'
1
bedeutet, jede Zeile zu drucken.
Die awk-Anweisung entspricht dem Schreiben von:
awk -F"=" '{OFS="=";gsub(",",";",$2);print $0;}'