awk: Druckt nur Linien, die nach einem bestimmten Schutzlinienmuster kommen

7

Betrachten Sie diese Datei:

#!/usr/bin/env bash
cat > example_file.txt <<EOL
|dms,wew,qwqw|
|m|head1|
|3,4,6|
|3e,2,23|
|m|head2|
|xw,12,2123|
|23,d,213|
|23,22q,2skl|
|m|head1|
|dljs,wqpw,2;a|
|dllw,w1p,1q;a|
EOL

Hin und wieder gibt es ein Schutzmuster: eine Linie, die beginnt mit:

|m|

(Ja, die erste Zeile der Datei muss kein Schutzmuster sein.) Jetzt möchte ich nur die Zeilen drucken, für die das letzte Schutzmuster war:

|m|head1|

und ignorieren Sie alle anderen Zeilen. Im schlimmsten Fall möchte ich, dass die Ausgabe:

#!/usr/bin/env bash
cat > desired_result_file.txt <<EOL
|m|head1|
|3,4,6|
|3e,2,23|
|m|head1|
|dljs,wqpw,2;a|
|dllw,w1p,1q;a|
EOL
user2413
quelle

Antworten:

7

Regex-orientiert

$ awk '/^\|m\|/ {/\|head1\|/ ? p=1 : p=0} p' example_file.txt 
|m|head1|
|3,4,6|
|3e,2,23|
|m|head1|
|dljs,wqpw,2;a|
|dllw,w1p,1q;a|

oder feldorientiert

$ awk -F'|' '$2 == "m" {$3 == "head1" ? p=1 : p=0} p' example_file.txt 
|m|head1|
|3,4,6|
|3e,2,23|
|m|head1|
|dljs,wqpw,2;a|
|dllw,w1p,1q;a|

p ist effektiv eine Druckflagge.

Awk-Programme bestehen aus pattern {action}Paaren, in denen actionein Datensatz ausgeführt wird, wenn patterntrue (ungleich Null) ausgewertet wird. Sie können weglassen pattern- in diesem Fall {action}wird für jeden Datensatz ausgewertet - oder weglassen, {action}in welchem ​​Fall awk das Standardmuster anwendet , mit dem der Datensatz gedruckt wird: Letzteres geschieht hier.

Steeldriver
quelle
Wie steuert die Variable p das Drucken? Ich sehe, wie es eingestellt ist, aber wo wird das im awk-Handbuch usw. erklärt?
Joe
@ Joe Ich habe einige Erklärungen desp
Stahlflusses