05
juin 2018

Awk, remplacer une valeur sur une ligne commencant par une valeur

J'ai eu a traiter une liste de fichiers dans laquelle je devais remplacer une valeur par une autre mais sur un type de ligne bien particulier. Awk m'a sauvé.

Le fichier est de type texte avec le ; comme séparateur de champ. Je dois remplacer la valeur contenue dans la 8 colonnes des lignes commençant par la valeur PAR. Ce qui donne :

for i in *.txt; do awk -i inplace -F";" 'BEGIN{OFS = FS}; { if($1=="PAR") {$8="3027008440109";} print }' $i; done

Explication :

  • for i in *.txt; do... : je lui demande de parcourir le répertoire courant avec un filtre sur les fichiers ayant l'extention .txt;
  • awk -i inplace : modification du fichier;
  • -F";" : séparateur de colonne dans le fichier;
  • 'BEGIN{OFS = FS}; : conserver le séparateur;
  • { if($1=="PAR") : condition, le $1 correspond au premier champ. Dans cet exemple la suite de la commande awk va travailler uniquement sur les lignes PAR;
  • {$8="3027008440109";} : remplacement le contenue de la 8eme colonne par la valeur 30270048440109;
  • print }' : "imprime" le reste du fichier;
  • $i : le fichier à traiter obtenu par le boucle for;

Version simplifié proposé par Neox sur linuxfr

awk -i inplace -F";" 'BEGIN{OFS = FS}; { if($1=="PAR") {$8="3027008440109";} print }' *.txt

Administrateur système de métier mais surtout curieux de découvrir de nouvelles technos très orientées DIY. A mes heures perdues je fais de la photo avec toujours une petite envie d'intégrer des DIY sous forme de timelaps à base de raspberry.

Écrire un commentaire

Quelle est la troisième lettre du mot bbzv ? :

Awk, remplacer une valeur sur une ligne commencant par une valeur - BlogoFlip - Philippe Maladjian - Péripéties bucoliques d'un administrateur systèmes au royaume de la virtualisation, du stockage et accessoirement photographe à ses heures perdues