awk + Zeilen von der ersten Zeile bis zum Übereinstimmungswort drucken


8

Ich möchte alle Zeilen von der Datei bis zum Übereinstimmungswort drucken. Bitte geben Sie an, wie das mit awk geht

zum Beispiel

Ich möchte alle Zeilen bis zum Wort PPP drucken

Beachten Sie, dass die erste Zeile von AAA abweichen sollte (jedes Wort).

cat file.txt

AAA   ( the first line/word chuld be any word !!!!! )
BBB
JJJ
OOO
345
211
BBB
OOO
OOO
PPP
MMM
(((
&&&

Also muss ich das bekommen

AAA
BBB
JJJ
OOO
345
211
BBB
OOO
OOO
PPP

anderes Beispiel (möchte bis KJGFGHJ drucken)

 cat file.txt1

 HG
 KJGFGHJ
 KKKK

also muss ich bekommen

 HG
 KJGFGHJ

Antworten:


12

Versuchen:

$ awk '1;/PPP/{exit}' file
AAA
BBB
JJJ
OOO
345
211
BBB
OOO
OOO
PPP

5
Gleiches gilt für oben über sed:sed '/PPP/q' infile
Costas

@Costas: Ja, das OP will awk, also gebe ich anderen keine Tools.
Cuonglm

Die 1 am Anfang ist wie eine vollständige Anweisung "// {print $ 0}", die immer übereinstimmt. awk druckt nicht ohne.
Cidermole

@ Cidermole: Nicht genau. 1ist wie {print $0}. Beachten Sie auch, dass //es sich um ein leeres Muster handelt und das Ergebnis nicht angegeben ist. Es ist Arbeit in gawk, mawk, Brian Kernighan eigene Version aber nicht in nawk, oawkvon Erbstück Tools Brust.
Cuonglm

Danke für die sed Lösung! Ich möchte nur, dass es fertig ist und mir ist das Werkzeug egal
Aaron McMillin

6

Alternativ können Sie ein Bereichsmuster verwenden, das mit der ersten Zeile (NR gleich 1) bis zur ersten Übereinstimmung von 'PPP' in einer Zeile übereinstimmt

awk 'NR==1,/PPP/' file

Wenn die Linie genau mit 'PPP' übereinstimmen muss, verwenden Sie nur

awk 'NR==1,/^PPP$/' file

Wenn Sie dasselbe für jede Datei in der Argumentliste tun möchten, verwenden Sie die FNR-Variable, die für die erste Zeile jeder verarbeiteten Datei auf 1 zurückgesetzt wird

awk 'FNR==1,/PPP/' file1 file2 ...

2

Wie OP sagte, kann seine erste Zeile oder sein erstes Wort der Datei ein beliebiges Wort enthalten (wie sich PPPselbst). Sie müssen dies also überprüfen und die erste Zeile vom Abgleich abhalten und vermeiden awk, dass sie dort beendet wird.

Dann können Sie dies versuchen:

Eingabedatei:

PPP # the first line/word chuld be any word !!!!! )
BBB
$$$
JJJ
OOO
PPP
345
PPP
%%%

Befehl:

awk '1;/PPP/{if (NR>1) exit}' file

Ausgabe:

PPP # the first line/word chuld be any word !!!!! )
BBB
$$$
JJJ
OOO
PPP
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.