Text ersetzen - (schon wieder - ich weiß)

M

michael77

Jungspund
Moin Forum,

ich muss in einer Datei wenn Bedingung A und B erfüllt ist, einen Wert in einer bestimmten Spalte ändern.

Genauer:
Wenn in der 1. Spalte ein "A" ist und in der 4. Spalte der Wert "40", muss ich die "40" durch eine "60" ersetzen.
Es können beliebig viele Zeilen zwischen den Zeilen mit einer "A"-Spalte sein.

Das suchen und ersetzen via awk sieht (dank Gott_in_schwarz in einem älterem Beitrag) schon einmal gut aus -

Nur, wie bekomme ich das wieder in die Datei rein?

awk - Einzeiler:
Code:
awk -F';' 'BEGIN{OFS=";"} {if ($1 == "A") {if ($4 == "40")  {$4 = "60"; print $0}}}' DATANORM.001


Auszug aus den gegebenen Daten:
Code:
[...]
A;N;1135005223;[B]40[/B];Roth Klemmverschraubung 20mm; ;1;0;ST;490;41;30;00000994;
B;N;1135005223; ; ; ;0;0;0;4037115024689;RWU00082.tif;3090;0;10; ; ;
D;N;1135005223;1;F;;Verpackungseinheit: 10 St<81>ck;;;;;
A;N;1135005238;[B]40[/B];Roth WP-W<84>rmemengenz<84>hler/Gr<94>áe 1; ;1;0;ST;33000;53;38;00001040;
B;N;1135005238; ; ; ;0;0;0;4037115024696;RWU00742.tif;3890;0;1; ; ;
D;N;1135005238;1;F;;Nennweite:                DN 20;;;;;
D;N;1135005238;2;F;;Nenndurchfluss:           2,5 m3/h;;;;;
D;N;1135005238;3;F;;Betriebstemperatur:       5-90'C;;;;;
D;N;1135005238;4;F;;Druckstufe:               PN 16;;;;;
D;N;1135005238;5;F;;Anschlussgewinde:         R 3/4";;;;;
D;N;1135005238;6;F;;L<84>nge mit Verschraubung:  230 mm;;;;;
D;N;1135005238;7;F;;Gewicht 0,8 kg;;;;;
D;N;1135005238;8;F;;Einsatz:;;;;;
D;N;1135005238;9;F;;TerraCompact B 6-10 kW, TerraCompact;;;;;
D;N;1135005238;10;F;;6-12 kW (PC), AuraCompact P 8 kW,;;;;;
D;N;1135005238;11;F;;AuraModul 12 kW, AuraModul 7-12 kW E,;;;;;
D;N;1135005238;12;F;;AquaCompact 11-13 kW;;;;;
A;N;1135005239;[B]40[/B];Roth WP-W<84>rmemengenz<84>hler/Gr<94>áe 2; ;1;0;ST;75500;53;38;00001040;
[usw]

Gruß Michael
 
Zuletzt bearbeitet:
Nur, wie bekomme ich das wieder in die Datei rein?
Über ne temporäre Datei:
Code:
awk -F';' 'BEGIN{OFS=";"} {if ($1 == "A") {if ($4 == "40")  {$4 = "60"; print $0}}}' DATANORM.001 > /tmp/TMPFILE &&
mv -i /tmp/TMPFILE DATANORM.001
 
Über ne temporäre Datei:
Code:
awk -F';' 'BEGIN{OFS=";"} {if ($1 == "A") {if ($4 == "40")  {$4 = "60"; print $0}}}' DATANORM.001 > /tmp/TMPFILE &&
mv -i /tmp/TMPFILE DATANORM.001


Danke, erstmal, aber das ist es eben nicht.

Damit hab ich bloss die geänderten Zeilen in der neuen Datei - ich brauche aber auch den Rest.

Datei nach deinem Vorschlag:
Code:
A;N;1110000823;60;Roth Abschlusswinkelset; ;1;0;ST;955;51;35;00000899;
########## hier fehlt was ########
A;N;1110000824;60;Roth Schraubenset M10; ;1;0;ST;158;51;35;00000900;
A;N;1110000825;60;Roth Befestigungselement D; ;1;0;ST;1960;51;35;00000904;
A;N;1110000826;60;Roth Befestigungselement E; ;1;0;ST;2380;51;35;00000902;
A;N;1110000827;60;Roth Sicherungsset; ;1;0;ST;158;51;35;00000903;

Orginal:
Code:
[...]
A;N;1110000823;40;Roth Abschlusswinkelset; ;1;0;ST;955;51;35;00000899;
[B]B;N;1110000823; ; ; ;0;0;0;4037115021268;RWU00682.tif;3590;0;1; ; ;[/B]
A;N;1110000824;60;Roth Schraubenset M10; ;1;0;ST;158;51;35;00000900;
[...]
 
Dann gib die Zeile halt immer aus und ändere manchmal die Spalte:
Code:
awk -F';' 'BEGIN{OFS=";"} {if ($1 == "A" && $4 == "40")  {$4 = "60"} print $0}'

edit:
Zu berücksichtigen wäre der Fall, dass der Output-Field-Seperator nicht gleich dem Input-Field-Seperator ist. (Bei dir ist das nicht der Fall, zumindest hier nicht. Bei dir ist beides ein semicolon.)
$0 wird nämlich nur "geupdatet" (sprich gesplittet mit IFS und gejoint mit OFS), wenn ein Feld verändert oder ein neues Feld hinzugefügt wurde.
Falls sich IFS und OFS unterscheiden müsste man dann so einen Hack wie "$1 = $1" o.ä. einfügen damit awk $0 wie intuitiv erwartet updatet.
 
Zuletzt bearbeitet:

Ähnliche Themen

Prblem mit zeilenweises auslesen von Datei und schreiben nach mysql

Shellskript - Fehler in Cron

AWK Tip gesucht

Aufgabe in C

Variableninhalt wird nicht gespeichert

Zurück
Oben