
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 comENR1
, 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>=1
testando 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 comENR1
seguido por 5 campos([^;]+;){5}
e o 7º campo00;