2012-03-29 26 views
1

wollte ich nicht wirklich haben, dies zu verschwenden Menschen Zeit und fragen, aber nach 2 Stunden und läuft aus meiner Zeit habe ich beschlossen, zu fragen ..zurücksetzen Variable neue Linie awk

Im Grunde habe ich eine Datei im Format:

word: other words; more words here; last word 
word: more words here; last word 
(etc) x 100 

Wo das Auftreten anderer Wörter/mehr Wörter null oder mehr sein kann.

Mein Ziel ist es, die Anzahl der Male zu zählen ';' tritt pro Zeile auf und druckt sie dann am Anfang der Zeile aus.

Meine Logik war, verwenden Sie awk für eine Regex von ';' und erhöhen Sie eine Variable jedes Mal, wenn es auftritt, dann drucken Sie die Variable.

Zur Zeit habe ich: (btw, wie ich meinen Code setzen in wie ein schattierten Feld ...)

awk ' /;/ {n=n+1} {print n " " $0}' a.txt 

Jedoch habe ich rückgängig gemacht in geworden, dass mein ‚n‘ wird nicht zurückgesetzt, wenn awk liest die nächste Zeile. Wie setze ich n zurück, wenn sich awk in die nächste Zeile bewegt? Ich habe versucht, v = NR und wenn v! = NR dann n = 0, aber ich konnte das nicht funktionieren.

Ich habe auch eine letzte Frage, wie setze ich eine Variable gleich einem Regex?

Dankhaufen,

Antwort

3

Weit besser eine Minute meines Lebens zu verschwenden als hundertzwanzig von Ihnen :-)

können Sie nur das Feldtrennzeichen verwenden, um dies zu tun:

pax> echo 'word: other words; more words here; last word 
word: more words here; last word' | awk 'BEGIN {FS=";"}{print NF"> "$0}' 

3> word: other words; more words here; last word 
2> word: more words here; last word 

Setzen Sie das Feldtrennzeichen FS grundsätzlich auf ein Semikolon, so dass die Anzahl der Felder NF wie gewünscht eingestellt ist. Drucken Sie dann die Variable NF zusammen mit Ihrer gesamten Zeile $0 aus.


Und Sie können Codeblöcke erhalten, indem Sie jeder Zeile vier Leerzeichen voranstellen. Wenn Sie eine Frage stellen, befindet sich oben rechts in der Box ein orangefarbenes Fragezeichen. Klicken Sie darauf, und es wird eine menügesteuerte Formatierungshilfe angezeigt.


Was Ihre letzte Frage, ergänzt mit Ihrem (paraphrasiert) Kommentar:

Ich habe auch noch eine letzte Frage, wie kann ich eine Variable auf einen regulären Ausdruck gleich sein? Ich wollte eine Variable setzen, die dem gesamten Text vor dem ':' entspricht (also sollte die Regex 'Wort' isolieren).

Dafür können Sie nur eine Kopie des ersten Felds und eine Substitution darauf durchführen. Ich habe mehrzeiligen die awk Befehle, da sie immer komplexer und das macht sie leichter zu lesen, aber man kann sie alle auf eine Zeile setzen, wenn Sie wollen:

pax> echo 'xyzzy: other words; more words here; last word 
plugh: more words here; last word' | awk ' 
    BEGIN {FS=";"} 
    { xx = $1; 
     gsub (/:.*/, "", xx); 
     print NF" ("xx") > "$0 
    }' 
3 (xyzzy) > word1: other words; more words here; last word 
2 (plugh) > word2: more words here; last word 

gsub (/:.*/, "", xx) einfach die regex ersetzen :.* (Doppelpunkt gefolgt von irgendetwas) mit nichts für die Variable xx.

+0

Danke, funktioniert gut :-) – Max

+0

Als Antwort auf Ihr letztes Bit, wenn ich eine Variable gleich einem Regex setzen wollte, dann drucken Sie es aus. Wo die Regex nur Text vor dem ':' war (also sollte die Regex 'Wort' isolieren) und wollte eine Variable gleich diesem setzen. Wie würde ich? – Max

+0

@ Max, siehe das Update. – paxdiablo