2016-05-06 16 views
0

Ich habe einen ähnlichen Beitrag mit dem Titel "Drucken Zeilen mit einem Muster nur dann, wenn die nächste Zeile stimmt nicht mit dem Muster" für die die Lösung erwähnt istawk: Zeilen mit einem Muster nur dann drucken, wenn die nächste Zeile auch mit dem gleichen Muster beginnt

awk 'a=/^O/{x=$0} !a&&x{print x;x=0;}' myfile 

ich wollte nur wissen, wie würde der obige Befehl ändern, wenn ich alle Zeilen in einer Datei, deren nächste Zeile zu beginnen mit dem gleichen Muster wie die aktuelle Zeile gedruckt werden soll.

beispiel

Datei Text enthält:

abc this is a line 
def 
abc this is line 2 
ghi 
abc this is line 3 
abc this is line 4 
jkl 
mno 
abc this is line 5 
jkl 
abc this is line 6 
abc this is line 9 
jkl 

der Befehl sollte so beschaffen sein, dass nur folgende Zeilen gedruckt werden sollen:

abc this is line 3 
abc this is line 6 

Jede Hilfe sehr würde geschätzt.

Danke an alle, die geholfen haben. Original-Frage ein bisschen hier zu bearbeiten, um die Anforderung zu erfüllen, da das Folgende nicht hilft, wenn es mehrere ähnliche Linien gibt.

Was wäre der Befehl awk, wenn alle Zeilen in einer Datei, so dass die nächste Zeile mit einem anderen Muster endet, gedruckt werden sollen.

Z. B: wenn Datei enthält:

Student name is A 
Student name is B 
Student name is C 
result for C is pass 
Student name is D 
result for D is pass 
Student name is E 
result for E is pass 
Student name is F 
result for F is pass 
Student name is G 
result for G is pass 
Student name is H 
Student name is I 
result for I is pass 

Wie kann ich awk verwenden, um alle Zeilen mit Schülernamen zu drucken, wo die Schüler passieren nicht. So zum obigen Beispiel der Linien gedruckt werden soll:

Student name is A 
Student name is B 
Student name is H 

Kann ich alle Zeilen drucken, die mit dem Student beginnen, wo ihre folgende Zeile mit der Zeichenfolge PASS nicht awk am Ende mit?

+0

Was passiert, wenn 3 oder mehr aufeinanderfolgende Zeilen mit diesem Muster beginnen? –

+0

Sie denken rückwärts darüber nach. Wenn du Spielkarten umdrehst und einen König umlegst, ist es schwierig, etwas zu tun, abhängig davon, ob deine nächste Karte ein Ass sein wird oder nicht, weil du deine nächste Karte noch nicht gesehen hast. Auf der anderen Seite, wenn Sie ein Ass umdrehen, ist es sehr einfach, etwas zu tun, wenn Ihre vorherige Karte ein König war, weil Sie es bereits gesehen haben. Die gleichen 2 Karten in der gleichen Reihenfolge, aber THINKING darüber anders zeigt Ihnen eine harte Lösung und eine einfache Lösung. Vermeide es, Dinge basierend auf dem, was als nächstes kommt, zu tun, wenn du es basierend auf dem, was vorher kam, tun kannst. –

Antwort

5

EDIT:

Für die aktualisierten Anforderungen:

Kann ich alle Zeilen drucken, die mit dem Student beginnen, wo ihre folgende Zeile mit der Zeichenfolge PASS nicht awk am Ende mit?

$ awk '$NF != "pass" && p0 {print p0} {p0 = ($1 == "Student") ? $0 : ""}' sw.txt 
Student name is A 
Student name is B 
Student name is H 

Zurück:

drucken Sie alle Zeilen in einer Datei beginnt nächste Zeile dessen auch mit dem gleichen Muster wie die aktuelle Zeile.

$ awk '$1 == p1 {print p0} {p1 = $1; p0 = $0}' sw.txt 
abc this is line 3 
abc this is line 6 

Wenn das aktuelle erste Feld entspricht wörtlich, dass die vorherigen Zeile, wir die vorhergehende Zeile zu drucken.

(Ich beachte, dass, während Ihre Frage bezieht sich auf Zeilen beginnend mit dem gleichen "Muster", basierend auf dem Beispiel Eingabe und Ausgabe habe ich das einfache String-Matching und nicht mit regulären Ausdrücken als "Muster zu tun "bezieht sich normalerweise auf awk.)

+0

vielleicht beachten Sie, dass dies kein Mustervergleich ist, sondern eine wörtliche Übereinstimmung (Gleichheit). Die Frage ist auch vage. – karakfa

+0

Guter Punkt @karakfa, wird klären. – jas

+0

Dies würde eine anfängliche Leerzeile drucken, wenn die erste Zeile der Eingabedatei leer oder mit einem Wert gestartet wurde, der unabhängig vom Wert der zweiten Zeile numerisch auf 0 auswertet. @ codecrazy46 - auch, klar, wenn Sie immer einen String oder numerische oder Regexp Vergleich wollen, wie Sie jetzt finden Sie string Übereinstimmungen für einige Werte und numerische für andere (so '0' ==' 0.00', etc.). Verwenden Sie niemals das Wort 'pattern' alleine in den Softwareanforderungen, da es mehrdeutig ist - benutzen Sie zumindest' string' oder 'regexp' (oder in diesem Fall' numeric') UND wenn Sie eine vollständige oder teilweise Übereinstimmung wünschen ('' abcde' match 'abc'?) –

Verwandte Themen