Modif fichier viaun autre fichier de transcodification unix

Résolu
JsuisNul -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
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

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
  2. JsuisNul
     
    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
  3. JsuisNul
     
    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
  4. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. JsuisNul
     
    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
  7. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
  8. JsuisNul
     
    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
  9. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    il faut modifier
    {$3=$7=t[$2]; print}'
    par
    {$3=$7=t[$3]; print}'
    0
  10. JsuisNul
     
    J'ai testé et ça fonctionne.

    comment dois-je faire pour que la modification se fasse directement dans mon fichiers 1 ?
    0
  11. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
  12. JsuisNul
     
    Super !! merci pour ton aide.

    A bientôt ;-)
    0
  13. JsuisNul Messages postés 137 Statut Membre 1
     
    par contre j'arrive pas à trouver le lien pour le marquer "Résolu", tu peux faire quelque chose dubcek ?
    0