Substituir um campo apenas por linhas iniciadas por uma string com uma string definida

0

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;

Eu devo substituir o campo 7 de cada linha. Se o valor for 00 , devo configurá-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 as linhas que começam com ENR1?)

    
por Kiko Netzone 07.07.2017 / 14:01

2 respostas

1

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 igual a 00
  • $7 = "01" define o 7º campo como 01
  • { print } imprime todas as linhas, incluindo o ENR1 depois da alteração.

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

por 07.07.2017 / 14:17
0

Abordagem curta sed :

sed -E 's/^(ENR1;([^;]+;){5})00;/1;/' 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 as linhas que começam com ENR1 seguido por 5 campos ([^;]+;){5} e o sétimo campo 00;
por 07.07.2017 / 15:10

Tags