Sie haben zwei Möglichkeiten, beide unordentlich.
Sie müssen möglicherweise mit # 2 etwas spielen, um es zum Laufen zu bringen, aber es sollte funktionieren. Es ist schon eine Weile her, seit ich irgendwas awk gemacht habe.
Das spezielle END
-Muster passt erst nach dem Ende von alle Eingabe . Beachten Sie, dass dieses Muster nicht mit anderen Mustern kombiniert werden kann.
Nützlicher ist wahrscheinlich die Pseudo-Funktion getline
, die %code%
auf die nächste Zeile zurücksetzt und 1 zurückgibt, oder im Falle von EOF return 0! Was ich denke, was du willst.
Zum Beispiel:
%Vor%Wenn Sie nur eine Datei verarbeiten, wäre dies äquivalent:
%Vor%Das Erkennen des EOF ist nicht sehr zuverlässig, wenn sich mehrere Dateien in der Befehlszeile befinden. Der Start der Datei ist zuverlässiger.
Um dies zu tun, ist die erste Datei speziell und wir ignorieren die FNR == 1.
Nach der ersten Datei wird FNR == 1 zum Ende der vorherigen Datei. last_filename hat immer den Dateinamen, den Sie verarbeiten.
Mach deine Dateiverarbeitung nach dem else.
Machen Sie Ihre EOF-Verarbeitung im else-Block und im END-Block.
%Vor%Bei mehreren Dateisätzen wird der Else-Block bei EOF für alle bis auf die letzte Datei ausgeführt. Die letzte Datei wird im END-Block ausgeführt.
Bei einzelnen Dateigruppen wird der Else-Block nicht ausgeführt und der END-Block wird ausgeführt.
gawk Implementierung hat eine spezielle Regel namens ENDFILE
, die nach der Verarbeitung jeder Datei in der Argumentliste ausgelöst wird. Das funktioniert:
Weitere Details finden Sie hier & gt; & gt;
Das coole an diesem Hack ist, dass durch die Zuweisung zu
alle verbleibenden deklarativen Muster und Aktionen funktionieren, eine Zeile verzögert. Sie können sie nicht für END
END
arbeiten lassen, selbst wenn Sie %code% oben setzen, aber Sie tun die Kontrolle über die letzte Zeile haben und nichts anderes getan haben es.
Eine portable Lösung ist im gawk Benutzerhandbuch enthalten obwohl, wie in einer anderen Antwort erwähnt, gawk selbst BEGINFILE und ENDFILE hat.