Reemplazar un campo solo para líneas que comienzan con una cadena con una cadena definida

Reemplazar un campo solo para líneas que comienzan con una cadena con una cadena definida

Aquí está el archivo que necesito tratar.

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;

Debo sustituir el campo 7 de cada línea. Si el valor es 00, entonces debo establecerlo en 01. Pero sólo para líneas cuyo primer campo esENR1!

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

Esto funciona pero también reemplaza el campo $7 con líneas que comienzan con ENR6.

¿Cómo agregar la condición (¿solo líneas que comienzan con ENR1?)

Respuesta1

lo intentaré

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

dónde

  • $7 == "00" && $1 == "ENR1" { $7 = "01" }solo se aplica a la línea que comienza con ENR1, teniendo el séptimo campo igual a00
  • $7 = "01"establezca el séptimo campo en 01
  • { print }Imprima cada línea, incluida la de ENR1 después del cambio.

  • es posible que desee realizar NR>=1la prueba si el archivo real tiene un encabezado de una línea.

Respuesta2

Cortosedacercarse:

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

La salida:

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;- captura líneas que comienzan con ENR1seguidas de 5 campos ([^;]+;){5}y el séptimo campo00;

información relacionada