Wie erkenne ich EOF in awk?

7

Gibt es eine Möglichkeit zu bestimmen, ob die aktuelle Zeile die letzte Zeile des Eingabestreams ist?

    
user3562 29.10.2009, 21:22
quelle

11 Antworten

8

Sie haben zwei Möglichkeiten, beide unordentlich.

  1. Speichern Sie eine Kopie jeder aktuellen Zeile in einer temporären Variable und verwenden Sie dann den END-Block, um sie zu verarbeiten.
  2. Verwenden Sie den Systembefehl, um "wc -l | getline" im BEGIN-Block auszuführen, um die Anzahl der Zeilen in der Datei abzurufen, und dann den Wert hochzählen.

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.

    
SDGator 29.10.2009, 21:40
quelle
8

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%     
uriel 29.10.2009 21:41
quelle
5

Dies sind die einzig sinnvollen Möglichkeiten, das zu tun, was Sie wollen, in der Reihenfolge von gut zu schlecht:

%Vor%     
Ed Morton 12.12.2012 20:55
quelle
4

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.

    
rickfoosusa 18.02.2014 21:44
quelle
2

gawk Implementierung hat eine spezielle Regel namens ENDFILE , die nach der Verarbeitung jeder Datei in der Argumentliste ausgelöst wird. Das funktioniert:

%Vor%

Weitere Details finden Sie hier & gt; & gt;

    
tworec 13.10.2016 12:18
quelle
1

Eine einfache Möglichkeit besteht darin, die Datei über ein intermediate sed -Skript auszuführen, das eine 0 auf jede nicht letzte Zeile und eine 1 auf die letzte setzt.

%Vor%     
fcr 06.12.2011 03:17
quelle
1

Ich bin mir nicht einmal sicher, wie ich diese "Lösung" kategorisieren soll

%Vor%

Das coole an diesem Hack ist, dass durch die Zuweisung zu END alle verbleibenden deklarativen Muster und Aktionen funktionieren, eine Zeile verzögert. Sie können sie nicht für 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.

    
DigitalRoss 05.11.2009 01:28
quelle
1

Um die letzte Zeile jeder Datei in der Argumentliste zu erkennen Folgendes funktioniert gut:

%Vor%     
sgr 09.09.2010 17:49
quelle
0

Hmm, die Variable awk END sagt dir, wenn du EOF bereits erreicht hast. Ist nicht wirklich viel Hilfe für dich, denke ich

    
jitter 29.10.2009 21:27
quelle
0

Sie können dies versuchen:

%Vor%     
user3859311 18.02.2016 08:47
quelle
0

Eine portable Lösung ist im gawk Benutzerhandbuch enthalten obwohl, wie in einer anderen Antwort erwähnt, gawk selbst BEGINFILE und ENDFILE hat.

    
Matt Wenham 02.01.2018 16:55
quelle

Tags und Links