%20zu%20teilen%3F%20.png)
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 data
als 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 lines
Variablen gespeichert wird. Jedes Mal, wenn eine Zeile data
gefunden 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 data
am Zeilenanfang und beschriften diese Zeile (das nennen wir das Label a
). Dann löschen wir vom Anfang des Puffers bis zur beschrifteten Zeile. Das ,p
gibt einfach den gesamten Inhalt des Puffers aus.
Bei Nicht-GNU-Versionen ist ed
das 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