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?)

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.


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;

Le paramètre -E ne semble pas être reconnu par UNIX (AIX) ...?
Kiko Netzone
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.