Modif fichier viaun autre fichier de transcodification unix [Résolu/Fermé]

Signaler
-
dubcek
Messages postés
18124
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 mars 2020
-
Bonjour à tous,

J'ai un fichier du type suivant :

fichier1:
champs1;champs2;champs3;champs4;champs5;
champs1;champs2;champs3;champs4;champs5;

avec séparateur ";"

on va me fournir un fichier de trans-codification comme suit:

fichier2
(Ancien valeur | nouvelle valeur)
1 A
2 B
3 C

je dois donc modifié le champs2 et le champs4 ( les deux champs contiennent la même donnée) par la valeur correspondante par rapport à ce qu'il y a dans mon tableau de transco:

exemple : si mon champs2 à une valeur de "1" le script doit le remplacer par la valeur "A"

Merci à vous par avance en espérant avoir été suffisamment clair .


(unix type AIX)

13 réponses

Messages postés
18124
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 mars 2020
4 712
hello
$ cat fichier1
champs1;1;champs3;1;champs5;
champs1;2;champs3;2;champs5;
champs1;3;champs3;3;champs5;
$ cat fichier2
1 A
2 B
3 C
$ awk 'BEGIN {while(getline<"fichier2")t[$1]=$2; FS=OFS=";"} {$2=$4=t[$2]; print}' fichier1
champs1;A;champs3;A;champs5;
champs1;B;champs3;B;champs5;
champs1;C;champs3;C;champs5;
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 72521 internautes nous ont dit merci ce mois-ci

Hello Dubcek,

Toujours aussi efficace ;-)

donc si j'ai bien compris dans mon petit script j'ecris ça comme ça ?

cat fichier1
cat fichier 2
awk 'BEGIN {while(getline<"fichier2")t[$1]=$2; FS=OFS=";"} {$2=$4=t[$2]; print}' fichier1

merci.
j'ai testé et j'ai un message d'erreur comme suit :

hraccess-/softwares/app/hraccess/txt/test_nso> ksh script_test
cccccccccc;ssssssssssss;26;zzzzzzzzz;rrrrrrrrrrrrrrr;aaaaaaaaaaaaa;26;ttttttttt;
cccccccccc;ssssssssssss;52;zzzzzzzzz;rrrrrrrrrrrrrrr;aaaaaaaaaaaaa;52;ttttttttt;
cccccccccc;ssssssssssss;27;zzzzzzzzz;rrrrrrrrrrrrrrr;aaaaaaaaaaaaa;27;ttttttttt;
cccccccccc;ssssssssssss;45;zzzzzzzzz;rrrrrrrrrrrrrrr;aaaaaaaaaaaaa;45;ttttttttt;




26 nnnn
27 wwww
45 xxxx
52 llll
syntax error The source line is 1.
The error context is
BEGIN >>> {while(getline<$SIGACS/txt/test_nso/fichier2. <<< txt)t[$1]=$2; FS=OFS=";"} {$3=$7=t[$2]; print}
awk: The statement cannot be correctly parsed.
The source line is 1.

est-ce que j'ai mal ecris quelque chose ?
Messages postés
18124
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 mars 2020
4 712
les cat sont juste là pour montrer les contenus des fichiers pour l'exemple
si SIGACS est une variable shell:
awk -v f="$SIGACS/txt/test_nso/fichier2.txt" 'BEGIN {while(getline<f)t[$1]=$2; FS=OFS=";"} {$3=$7=t[$2]; print} fichier1
Re-bonjour Dubcek,

ok j'ai modifié mon petit script en enlevant les cat et en reprenant ton dernière code et j'ai testé. le "sigacs" remplace le "hraccess-/softwares/app/hraccess/"

awk -v f="$SIGACS/txt/test_nso/fichier2.txt" 'BEGIN {while(getline<f)t[$1]=$2; FS=OFS=";"} {$3=$7=t[$2]; print}' $SIGACS/txt/test_nso/fichier1.txt

Voici le résultat :

hraccess-/softwares/app/hraccess/txt/test_nso> ksh script_test
cccccccccc;ssssssssssss;;zzzzzzzzz;rrrrrrrrrrrrrrr;aaaaaaaaaaaaa;;ttttttttt;
cccccccccc;ssssssssssss;;zzzzzzzzz;rrrrrrrrrrrrrrr;aaaaaaaaaaaaa;;ttttttttt;
cccccccccc;ssssssssssss;;zzzzzzzzz;rrrrrrrrrrrrrrr;aaaaaaaaaaaaa;;ttttttttt;
cccccccccc;ssssssssssss;;zzzzzzzzz;rrrrrrrrrrrrrrr;aaaaaaaaaaaaa;;ttttttttt;
;;;;;;
;;;;;;
;;;;;;
;;;;;;

J'ai pas l'impression que mon fichier 1 ai été modifié...
Messages postés
18124
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 mars 2020
4 712
montre quelques lignes de chaque fichier
selon le post #1, les champs du fichier2 sont séparés par un espace, est-ce le cas ?
Oui c'est le cas mais si c'est plus simple on peut mettre un séparateur genre ";" ?

Voici mes fichiers

Fichier 1:
cccccccccc;ssssssssssss;26;zzzzzzzzz;rrrrrrrrrrrrrrr;aaaaaaaaaaaaa;26;ttttttttt;
cccccccccc;ssssssssssss;52;zzzzzzzzz;rrrrrrrrrrrrrrr;aaaaaaaaaaaaa;52;ttttttttt;
cccccccccc;ssssssssssss;27;zzzzzzzzz;rrrrrrrrrrrrrrr;aaaaaaaaaaaaa;27;ttttttttt;
cccccccccc;ssssssssssss;45;zzzzzzzzz;rrrrrrrrrrrrrrr;aaaaaaaaaaaaa;45;ttttttttt;

Fichier 2:
26 nnnn
27 wwww
45 xxxx
52 llll
Messages postés
18124
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 mars 2020
4 712
il faut modifier
{$3=$7=t[$2]; print}'
par
{$3=$7=t[$3]; print}'
J'ai testé et ça fonctionne.

comment dois-je faire pour que la modification se fasse directement dans mon fichiers 1 ?
Messages postés
18124
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 mars 2020
4 712
avec awk, on ne peut pas modifier en même temps un fichier qu'on lit, donc par ex:
mv fichier1 fichier1.old
awk ... fichier1.old > fichier1
Super !! merci pour ton aide.

A bientôt ;-)
Messages postés
109
Date d'inscription
mercredi 13 février 2013
Statut
Membre
Dernière intervention
22 janvier 2020

par contre j'arrive pas à trouver le lien pour le marquer "Résolu", tu peux faire quelque chose dubcek ?
Messages postés
18124
Date d'inscription
lundi 15 janvier 2007
Statut
Contributeur
Dernière intervention
31 mars 2020
4 712