Modif fichier viaun autre fichier de transcodification unix

Résolu/Fermé
JsuisNul - 27 sept. 2013 à 15:48
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 - 30 sept. 2013 à 14:34
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)
A voir également:

13 réponses

dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
27 sept. 2013 à 16:34
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
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.
0
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 ?
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
28 sept. 2013 à 08:43
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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é...
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
30 sept. 2013 à 10:59
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 ?
0
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
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
30 sept. 2013 à 11:34
il faut modifier
{$3=$7=t[$2]; print}'
par
{$3=$7=t[$3]; print}'
0
J'ai testé et ça fonctionne.

comment dois-je faire pour que la modification se fasse directement dans mon fichiers 1 ?
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
Modifié par dubcek le 30/09/2013 à 12:01
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
0
Super !! merci pour ton aide.

A bientôt ;-)
0
JsuisNul Messages postés 122 Date d'inscription mercredi 13 février 2013 Statut Membre Dernière intervention 14 février 2024 1
30 sept. 2013 à 13:52
par contre j'arrive pas à trouver le lien pour le marquer "Résolu", tu peux faire quelque chose dubcek ?
0
dubcek Messages postés 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
30 sept. 2013 à 14:34
0