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.
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
@ user6129328 Beide Zeilen werden hier mit gnu awk getestet. – Kent
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