Substitua um campo apenas por linhas que começam com uma string por uma string definida

Substitua um campo apenas por linhas que começam com uma string por uma string definida

Aqui está o arquivo com o qual preciso lidar.

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;

Devo substituir o campo 7 de cada linha. Se o valor for 00, devo defini-lo como 01. Mas apenas para linhas cujo primeiro campo éENR1!

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

Isso funciona, mas também substitui o campo $7 por linhas que começam com ENR6.

Como adicionar a condição (apenas linhas começando com ENR1?)

Responder1

eu tentaria

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

onde

  • $7 == "00" && $1 == "ENR1" { $7 = "01" }aplicado apenas à linha que começa com ENR1, tendo o sétimo campo equivalente a00
  • $7 = "01"defina o 7º campo como 01
  • { print }imprima todas as linhas, incluindo ENR1 após a alteração.

  • você pode querer continuar NR>=1testando se o arquivo real tiver um cabeçalho de uma linha.

Responder2

Curtosedabordagem:

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

A saída:

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 linhas começando com ENR1seguido por 5 campos ([^;]+;){5}e o 7º campo00;

informação relacionada