Was ist die Bedeutung von 1 am Ende des awk-Skripts?

19

Ich habe dieses awk-Skript gelesen

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

Ich möchte wissen, was die Funktion 1am Ende davon ist

Randhir Singh
quelle
Sie könnten auch tunawk -F"=" '{OFS="=";gsub(",",";",$2)}{print}'
GypsyCosmonaut

Antworten:

24

Ein awkProgramm 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 1Ende 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).

Kevin
quelle
7

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 1die vorherige Anweisung geändert wird. Oder Sie denken vielleicht, es 1handelt sich um einen Alias ​​für {print}, der technisch nicht korrekt ist.

In Wirklichkeit 1handelt 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 conditionangegeben ist, lautet die Standardbedingung true.)

Hier 1ist also die Bedingung, die immer trueals ungleich Null ausgewertet wird. Das actionwird weggelassen, so dass der Standard {print}durchgeführt wird. Sie können sich das so vorstellen:

awk -F"=" '
{OFS="="; gsub(",",";",$2)}
1!=0 {print}
'
weises Glück
quelle
5

1 bedeutet, jede Zeile zu drucken.

Die awk-Anweisung ist dasselbe wie das Schreiben:

awk -F"=" '{OFS="=";gsub(",",";",$2);print $0;}'
Guru
quelle