Wie verwende ich awk, um die Zeile (den Datensatz) zu teilen?

Wie verwende ich awk, um die Zeile (den Datensatz) zu teilen?

Datei:

data
A B
C D
data
E F
G H
data
I J
K L
M N

Gewünschtes Ergebnis:

I J
K L
M N

Wie kann ich nach „Daten“ aufteilen? Ich habe bei Google danach gesucht, wie man awk verwendet, aber die meisten relativen awk-Methoden teilen die Spalte auf.

Antwort1

So verwenden Sie es dataals Datensatztrennzeichen und drucken den letzten Datensatz:

$ awk -v RS=data 'END{print}' File

I J
K L
M N

Dies erfordert ein awk, beispielsweise GNU awk (gawk) oder mawk, das mehrstellige Werte für unterstützt RS.

Antwort2

$ awk '/^data/ { lines = ""; next } { lines = (lines == "" ? $0 : lines ORS $0) } END { print lines }' file
I J
K L
M N

Dies wird verwendet awk, um den Inhalt der Eingabe nach der letzten Zeile abzurufen, die mit der Zeichenfolge beginnt data. Dies geschieht, indem jeder Zeilenabschnitt nach einer solchen Zeile in der linesVariablen gespeichert wird. Jedes Mal, wenn eine Zeile datagefunden wird, die mit beginnt, wird diese Variable geleert. Der Wert der Variablen wird ausgegeben, wenn das Ende der Eingabe erreicht ist.


Verwendung von sed:

$ sed -n 'H;${ x; s/.*\ndata\n//p; }' file
I J
K L
M N

Wir fügen alle Zeilen in den Haltebereich ein. Beim Auftreffen auf die letzte Zeile wird der Haltebereich in den Musterbereich verschoben und alles bis zur Zeichenfolge data(auf beiden Seiten von einer neuen Zeile flankiert) wird entfernt, bevor die verbleibenden Bits gedruckt werden.


Verwendung von ed:

$ printf "?^data?ka\n1,'ad\n,p\nQ\n" | ed -s file
I J
K L
M N

oder,

ed -s file <<END_ED
?^data?ka
1,'ad
,p
Q
END_ED

Dabei suchen wir zunächst rückwärts nach dem letzten Vorkommen des Strings dataam Zeilenanfang und beschriften diese Zeile (das nennen wir das Label a). Dann löschen wir vom Anfang des Puffers bis zur beschrifteten Zeile. Das ,pgibt einfach den gesamten Inhalt des Puffers aus.

Bei Nicht-GNU-Versionen ist eddas finale Q(zum Beenden ohne Speichern) wahrscheinlich nicht erforderlich.

Antwort3

Um Datensätze anhand der „Daten“ statt anhand einer neuen Zeile aufzuteilen, legen Sie die Variable RS (Datensatztrennzeichen) fest.

Sie sind nur am vierten Datensatz interessiert (der erste Datensatz steht vor den ersten „Daten“; er ist leer), drucken Sie also nur, wenn NR 4 ist.

cat file | awk 'BEGIN {RS="data\n"}; NR==4 {print}'

Antwort4

Habe es mit der folgenden Methode gemacht und es hat gut funktioniert. Befehl:

tac file.txt|sed -n '1,/data/p'| tac| sed -n '2,$p'

Ausgabe

 I J
 K L
 M N

verwandte Informationen