Angenommen, ich habe eine Textdatei wie:
R1 12 324 3453 36 457 4 7 8
R2 34 2342 2525 25 25 26 26 2 2
R3 23 2342 32 52 54 543 643 63
R4 25 234 2342 4 234242
Ich möchte verwenden awk
, um diese Zeilen anders zu verarbeiten, wie z
awk '/R1/ { print "=>" $0} /R2/ { print "*" $0} '
und ich möchte auch alle übrigen Zeilen so drucken, wie sie sind (ohne Duplikate der bereits verarbeiteten Zeilen anzufertigen). Grundsätzlich benötige ich eine /ELSE/ { print $0}
am Ende meiner awk
Zeile.
Gibt es so etwas?
awk
implementiert die üblichen Verdächtigen, wenn es um Bedingungen geht. Es ist eine gute Idee,printf
anstattprint
für den Job zu verwenden, den Sie auf Match erledigen möchten.quelle
if-then-else
.next
ist ein wichtiges Werkzeug bei der awk-Programmierung.printf
hier nicht. Der einzige Vorteil (es sei denn, Sie machen eine schickere Formatierung als Verkettung) ist, dass keine neue Zeile hinzugefügt wird, was hier nicht relevant ist.print
nur ausgeben,$0
währendprintf
ein Formatstring analysiert werden muss.Chris Down hat bereits gezeigt, wie Sie mithilfe einer expliziten 'if'-Anweisung in einem Block ein else für reguläre Ausdrücke erhalten können. Sie können den gleichen Effekt auch auf andere Weise erzielen, obwohl seine Lösung wahrscheinlich besser ist.
Eine besteht darin, einen dritten regulären Ausdruck zu schreiben, der nur mit Text übereinstimmt, der nicht von den anderen übereinstimmt. In Ihrem Fall würde dies ungefähr so aussehen:
Beachten Sie, dass dies verankerte reguläre Ausdrücke verwendet - das ^ am Anfang der regulären Ausdrücke stimmt nur mit dem Anfang einer Zeile überein - Ihre ursprünglichen Muster haben dies nicht getan, wodurch die Übereinstimmung etwas verlangsamt wird, da alle Zeichen in einer Zeile anstatt überprüft werden überspringen bis zur nächsten Zeile. Der dritte Fall ("else") stimmt mit einer Zeile überein, die mit einem Zeichen beginnt, das nicht "R" ([^ R]) ist, oder mit einem "R", gefolgt von einem Zeichen, das keine "1" oder "ist. 2 '(R [^ 12]). Die zwei unterschiedlichen Bedeutungen von ^ sind etwas verwirrend, aber dieser Fehler wurde vor langer Zeit begangen und wird in Kürze nicht mehr geändert.
Um komplementäre reguläre Ausdrücke verwenden zu können, müssen sie wirklich verankert sein, da sonst das [^ R] zB mit der darauf folgenden 1 übereinstimmt. Für sehr einfache reguläre Ausdrücke wie Sie kann dieser Ansatz nützlich sein, aber wenn die regulären Ausdrücke komplexer werden, kann dieser Ansatz nicht mehr verwaltet werden. Stattdessen können Sie Statusvariablen für jede Zeile wie folgt verwenden:
Diese Einstellung setzt den Wert für jede neue Zeile auf Null, dann auf 1, wenn sie mit einer der beiden regulären Ausdrücke übereinstimmt, und führt schließlich, wenn sie immer noch Null ist, den Ausdruck $ 0 aus.
quelle
rfile
Es werden nur 10000 Zeilen des Datensatzes des Fragestellers wiederholt.if (!handled)
Yuck! Verwenden Sienext
diese Option , um die Berücksichtigung anderer Aktionen zu beenden.if (!handled)
. Allgemeine, flexible und wiederverwendbare Lösungen sind gut. Was ist, wenn die nächste Person, die diese Frage hat, nach dem Drucken weitere Verarbeitungsschritte ausführen möchte? Die Antworten mitnext
stützen das nicht.