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 champs. 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