Remplacer un champ uniquement pour les lignes commençant par une chaîne avec une chaîne définie

0

Voici le dossier que je dois traiter.

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;

Je dois substituer le champ 7 de chaque ligne. Si la valeur est 00, alors je dois le définir sur 01. Mais seulement pour les lignes dont le premier champ estENR1!

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

Ceci fonctionne mais remplace également le champ $ 7 par des lignes commençant par ENR6.

Comment ajouter la condition (uniquement les lignes commençant par ENR1?)

Kiko Netzone
la source

Réponses:

1

Je voudrais essayer

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

  • $7 == "00" && $1 == "ENR1" { $7 = "01" }s’applique uniquement à la ligne commençant par ENR1, ayant un septième champ équivalent à00
  • $7 = "01" mettre le 7ème champ à 01
  • { print } imprimer chaque ligne, y compris ENR1 après modification.

  • vous souhaiterez peut-être garder le NR>=1test si le fichier réel a un en-tête d'une ligne.

Archemar
la source
Le chèque n'est pas nécessaire à mon humble avis. La version "plus courte" serait quelque chose comme:awk -F';' -vOFS=";" '/ENR1/{$7="01"}1' filename
Valentin Bajrami
0

Approche courte sed :

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

Le résultat:

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;- capture les lignes commençant par ENR1suivi de 5 champs ([^;]+;){5}et du 7ème champ00;
RomanPerekhrest
la source
Le paramètre -E ne semble pas être reconnu par UNIX (AIX) ...?
Kiko Netzone