Ersetzen Sie ein Feld nur für Zeilen, die mit einer Zeichenfolge beginnen, durch eine definierte Zeichenfolge

Ersetzen Sie ein Feld nur für Zeilen, die mit einer Zeichenfolge beginnen, durch eine definierte Zeichenfolge

Hier ist die Datei, mit der ich mich befassen muss.

ENR1;203023;0000;H606626;001505;EL;00;1234;0000100;00;00;201346100;H6022418;
ENR6;000218;130155;000;00;201443;000000000;000000000;000000000;000000000;
ENR1;203357;0000;H606626;001653;EL;01;2546;0000800;00;00;201346100;H6022418;
ENR6;000218;130155;000;00;201503;000000000;000000000;000000000;000000000;
ENR6;001811;150316;000;00;201624;000000000;000000000;000000000;000000000;
ENR1;203385;0000;H606625;000615;EL;00;5861;0000100;00;00;201346100;H6022418;

Ich muss das Feld 7 jeder Zeile ersetzen. Wenn der Wert ist 00, muss ich ihn auf setzen 01. Aber nur für Zeilen, deren erstes Feld istENR1!

awk -F';' -v OFS=';' 'NR>=1{sub("00","01",$7)}1' file > result

Dies funktioniert, aber ersetzen Sie auch das Feld $7 durch Zeilen, die mit ENR6 beginnen.

Wie füge ich die Bedingung hinzu (nur Zeilen, die mit ENR1 beginnen?)

Antwort1

ich würde versuchen

awk -F';' -v OFS=';' '$7 == "00" && $1 == "ENR1" { $7 = "01" } {print} ' file > result

Wo

  • $7 == "00" && $1 == "ENR1" { $7 = "01" }gilt nur für Zeilen, die mit beginnen ENR1, wobei das siebte Feld gleich ist00
  • $7 = "01"setze 7. Feld auf 01
  • { print }Drucken Sie jede Zeile, einschließlich ENR1s nach der Änderung.

  • Möglicherweise möchten Sie den Test fortsetzen, NR>=1wenn die echte Datei einen einzeiligen Header hat.

Antwort2

KurzsedAnsatz:

sed -E 's/^(ENR1;([^;]+;){5})00;/\101;/' file

Die Ausgabe:

ENR1;203023;0000;H606626;001505;EL;01;1234;0000100;00;00;201346100;H6022418;
ENR6;000218;130155;000;00;201443;000000000;000000000;000000000;000000000;
ENR1;203357;0000;H606626;001653;EL;01;2546;0000800;00;00;201346100;H6022418;
ENR6;000218;130155;000;00;201503;000000000;000000000;000000000;000000000;
ENR6;001811;150316;000;00;201624;000000000;000000000;000000000;000000000;
ENR1;203385;0000;H606625;000615;EL;01;5861;0000100;00;00;201346100;H6022418;

  • ^(ENR1;([^;]+;){5})00;- erfasst Zeilen beginnend mit ENR1gefolgt von 5 Feldern ([^;]+;){5}und dem 7. Feld00;

verwandte Informationen