Aus Gawks Handbuch:
Wenn awk-Anweisungen innerhalb einer Regel kurz sind, möchten Sie möglicherweise mehr als eine davon in eine Zeile einfügen. Dies wird erreicht, indem die Anweisungen durch ein Semikolon (';') getrennt werden. Dies gilt auch für die Regeln selbst. Daher könnte das am Anfang dieses Abschnitts gezeigte Programm auch folgendermaßen geschrieben werden:
/12/ { print $0 } ; /21/ { print $0 }
HINWEIS: Die Anforderung, dass Regeln in derselben Zeile mit einem Semikolon getrennt werden müssen, war nicht in der ursprünglichen awk-Sprache. Es wurde hinzugefügt, um die Übereinstimmung mit der Behandlung von Aussagen innerhalb einer Aktion zu gewährleisten.
Aber ich habe von https://stackoverflow.com/q/20262869/156458 gesehen
awk '$2=="no"{$3="N/A"}1' file
Sind nicht $2=="no"{$3="N/A"}
und 1
zwei Aussagen? warum sind sie nicht durch irgendetwas getrennt?
Vielen Dank.
'/12/;/21/'
alles so üblich ist wie awk idiom. IMO & IME ist es üblicher, so etwas zu schreiben als'/12|21/'
- effizienter auch, nur ein regulärer Ausdruck statt zwei oder mehr./12/;/21/
ist ein vereinfachtes Beispiel, um zu demonstrieren, warum Semikolon erforderlich ist, um Regeln / Bedingungen zu trennen. Für einfache Aufgaben haben Sie Recht, wir können nur einen regulären Ausdruck verwendenor
. Jemand kann diese Syntax "nur Bedingungen" auf kompliziertere Bedingungen erweitern, dawk ' $1==10;$2+$NF<100' file
. H. Aber da unter allen Bedingungen die Aktion gleich ist ={print $0}
, können wir theoretisch überall OR verwenden:awk '$1==10 || $2+$NF<10' file
a || b || c || d || e {action}
anstatta {action}; b {same action}; c {same action again} ...
. Es ist auch einfacher, eine einzige gemeinsame Aktion für all diese Muster zu ändern. in anderen Worten, während das etwas ist , Sie können tun, es ist auch etwas , das man so gut wie nie zu wollen. Ich dachte, das wäre es wert, zu Ihrer Antwort hinzugefügt zu werden.In gawk beschreiben diese beiden Zitate aus dem Handbuch das Problem:
Ein Semikolon ist ein " Trennzeichen ", aber kein " Terminator ".
Der einzig gültige Terminator einer Aktion ist eine schließende Klammer (
}
).Daher muss das, was auf eine Aktion folgt, die Klammer (
}
) schließt, ein anderes Muster {Aktion} seinIm "man mawk " gibt es eine andere Beschreibung, die helfen kann zu klären, was awk tun soll:
Der "Mann nawk " erklärt es so:
Wenn Sie sich mit Details befassen möchten, lesen Sie die POSIX-Beschreibung :
Und suchen Sie nach einer "nicht abgeschlossenen" Anweisungsliste.
Oder suchen Sie einfacher nach Aktion zum Lesen:
Nochmal:
are separated by <newline> or <semicolon> characters
quelle
Das Semikolon zwischen bedingten Blöcken scheint optional zu sein. Nur die Semikolons zwischen Anweisungen innerhalb von Blöcken scheinen obligatorisch zu sein:
Wenn jedoch der eigentliche Codeblock zwischen zwei Bedingungen zugunsten der Standardeinstellung (dh
{print}
) weggelassen wird, wird das Semikolon erforderlich:quelle