Gibt es eine Möglichkeit, die letzte Zeile einer Datei und dann die erste Zeile einer Datei nur in awk zu drucken?

7

Ich habe gesucht, aber eine Antwort gefunden. Ich möchte die letzte Zeile (oder Aufzeichnung) in einer Datei drucken. Drucken Sie dann die erste Zeile mit nur awk. Ich weiß, wie man die erste Zeile druckt:

NR == 1{print}

und letzte Zeile

END{print}

Wie kann ich jedoch die Positionen wechseln? Ist es überhaupt möglich? Ich bekomme nur Fehler, wenn ich das versuche. Gibt es eine Möglichkeit, die zu integrieren

NR == 1{print}

Befehl in den END-Befehl? Auch hier möchte ich dies nur in awk durchführen. Vielen Dank!

Nack
quelle

Antworten:

18

Speichern Sie einfach die erste Zeile in einer Variablen

awk 'NR==1 {first = $0} END {print; print first}' file

Ex. gegeben fileals

line 1
line 2
line 3
line 4
line 5

dann

$ awk 'NR==1 {first = $0} END {print; print first}' file
line 5
line 1
Steeldriver
quelle
Da ich neu bei awk bin, habe ich wohl nicht gedacht, dass ich das schaffen könnte, aber du hast mir das Gegenteil bewiesen. Vielen Dank! Es hat an meinem Ende funktioniert!
Nack
+1; Aber eine kleine Verbesserung: Wenn die Datei nur eine Zeile enthält, wird diese Zeile bei der Ausgabe wiederholt . Wenn die Datei leer ist, enthält die Ausgabe immer noch zwei leere Zeilen . Wenn das nicht erwünscht ist, können wir diese beiden Fälle wie folgt überprüfen:awk 'NR==1 {first = $0; gotfirst = 1} END {if (gotfirst==1) {if (NR!=1) {print} print first}}' file
Prem
1

AWK hat eine getline()Funktion, die es ermöglicht, zur nächsten Zeile überzugehen . Der Beendigungsstatus dieser Zeile ist Null, wenn wir nicht weiter vorrücken können, dh wir haben das Dateiende erreicht. Daher besteht die Grundidee, die wir verwenden können, darin, die erste Zeile in einer Variablen zu speichern, die aktuelle Zeile zu verfolgen und weiter zu versuchen, fortzufahren getline. Wenn wir nicht können - drucken Sie die Variablen in der gewünschten Reihenfolge.

$ cat input.txt
first line
middle line
last line

$ awk 'NR==1{first=$0};{while (getline line); printf "%s\n%s\n",line,first}' input.txt                                   
last line
first line
Sergiy Kolodyazhnyy
quelle