2016-03-29 14 views
1

Ich muss zweites Auftreten eines Musters (das mit dem letzten Feld übereinstimmt) durch ein anderes ersetzen und auch alle diese Änderungen in einer Datei zählen.Ersetzen zweiten Auftreten eines Musters in einer Zeile mit awk

Beispiel: try.txt

Hi 

Change apple orange guava mango banana orange 

It's hot outside 

Change tom greg fred harry steve fred 

George is a cool guy 

Change mary lucy becky karly jill karly 

thank you 

In allen Linien, die Muster "Change" hat, mag ich das letzte Wort ersetzen, zum Beispiel "orange" in der zweiten Zeile, mit etwa Birne. Beachten Sie, dass die erste Orange nicht geändert werden sollte. Ich möchte auch ein Suffix schreiben, das die Anzahl der Änderungen in der Datei anzeigt.

Ich versuchte folgendes, aber es änderte beide Vorkommen (1. orange und 2. orange, 1. fred und 2. fred, 1. karly und 2. karly), während ich nur das zweite Vorkommen ändern wollte.

awk 'BEGIN {cntr=0} {if (/Change/) {gsub($NF,"pear"); OFS=""; print $0,cntr; cntr++} else {print}}' try.txt 

Der Ausgang ist:

Hi 

Change apple pear guava mango banana pear0 

It's hot outside 

Change tom greg pear harry steve pear1 

George is a cool guy 

Change mary lucy becky pear jill pear2 

thank you 

gewünschte Ausgabe ist:

Hi 

Change apple orange guava mango banana pear0 

It's hot outside 

Change tom greg fred harry steve pear1 

George is a cool guy 

Change mary lucy becky karly jill pear2 

thank you 

Wenn gsub mit Sub ersetzt wird, ist es nur das erste Auftreten ändert sich. Jede Hilfe wird geschätzt.

Antwort

1

Diese Einzeiler für Ihre Eingabe funktioniert:

awk '/Change/{$NF="peal"(i++)}7' file 

Diese Linie wird die OFS jedoch überschreiben, wenn Sie OFS (kontinuierliche Räume zum Beispiel) unangetastet behalten möchten, können Sie tun:

awk '/Change/{sub(/\S+$/,"peal"(i++))}7' file 
+0

Hallo Kent, danke ein Haufen. Die erste Lösung hat funktioniert. Aber der zweite ändert nichts am Input. Es wird die Datei so wie sie ist gedruckt. – user6129328

+0

@ user6129328 Beide Zeilen werden hier mit gnu awk getestet. – Kent

+0

Ich brauche auch eine kleine Erweiterung: Was ist, wenn ich ein anderes Muster wie "Change2" habe, wo alle Zeilen, die dieses Muster enthalten, durch, sagen wir, peal2 ersetzt werden müssen und auch einen eigenen Zähler haben. – user6129328

0

ich glaube, ich fand eine Behelfslösung:

awk ‚BEGIN {cntr = 0} {if (/ ändern /) {$ NF = $ NF_cntr; sub ($ NF, "Birne"); OFS = ""; Druck $ 0, cntr; OFS = ""; cntr ++} sonst {print}} 'try.txt

Die Ausgabe war wie ich es wollte.

Aber ich würde immer noch gerne von der Gemeinschaft für bessere Möglichkeiten, es zu erreichen hören.

Dank

Verwandte Themen