Modification des fichiers

Résolu
GHISLINO Messages postés 214 Date d'inscription   Statut Membre Dernière intervention   -  
dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour, a tous

j'ai besoin d'aide s'il vous plait

en effet j'ai trois fichiers sous les formes suivantes

Fichier1
idbs;idbt;cel;ci;lac;trx;taux
53;45;LOURIA-1;14391,610;2;80
53;7;GABIA_ISSIA-3;7843,610;2;10
53;12;NAKIAHIO-1;11491,610;2;0
53;12;NAKIAHIO-1;11491,610;3;40
53;17;GADOUAN-2;7472,610;3;80
53;23;KIBOUO-3;7593,610;3;80
53;13;BOGUEDIA-1;7351,610;2;80
53;47;IBOGUHE-2;14432,610;4;0
53;47;IBOGUHE-3;14433,610;2;60

Fichier 2
ref;lac;ci;cel
14000;610;14391;LOURIA-1
10068;610;7843;GABIA_ISSIA-3
21712;610;11491;NAKIAHIO-1
10622;610;7472;GADOUAN-2
13932;610;7593;KIBOUO-3
13961;610;7351;BOGUEDIA-1
11239;610;14432;IBOGUHE-2
11240;610;14433;IBOGUHE-3

Fichier3
ref,trx,tre
14000,1,2
14000,2,1
10068,3,9
10068,1,5
10068,2,6
21712,2,3
21712,1,1
21712,3,2
10622,2,7
10622,1,6
10622,3,8
13932,3,6
13932,1,5
13932,2,8
13961,2,2
13961,1,1
11239,3,8
11239,4,7
11239,1,10
11239,2,4
11240,3,0
11240,1,0
11240,2,0

je veux obtenir un fichier final comme ceci

Fichierfinal

idbs;idbt;cel;ci;lac;trx;taux;tre
53;45;LOURIA-1;14391,610;2;80;2
53;7;GABIA_ISSIA-3;7843,610;2;10;6
53;12;NAKIAHIO-1;11491,610;2;0;3
53;12;NAKIAHIO-1;11491,610;3;40;2
53;17;GADOUAN-2;7472,610;3;80;8
53;23;KIBOUO-3;7593,610;3;80;6
53;13;BOGUEDIA-1;7351,610;2;80;2
53;47;IBOGUHE-2;14432,610;4;0;7
53;47;IBOGUHE-3;14433,610;2;60;0

le fichier final est obtenu avec ajout du champ tre du fichier3 mais tout en tenant compte des champs ci et trx des fichier1 et fichier2.

Merci d'avance pour vos reponse car je galere depuis un bon bout de temps.

j ai utilise grep et sed mais rien n'y fait.

11 réponses

  1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    essaye ça, j'ai changé les , en ; dans fichier3
    $ awk -F";" 'FNR==1{f++} f==1{f3[$1, $2]=$3} f==2{f2[$3]=$1} f==3{printf $0 FS f3[f2[$4], $6] "\n"}' fichier3 fichier2 fichier1
    idbs;idbt;cel;ci;lac;trx;taux;tre
    53;45;LOURIA-1;14391;610;2;80;1
    53;7;GABIA_ISSIA-3;7843;610;2;10;6
    53;12;NAKIAHIO-1;11491;610;2;0;3
    53;12;NAKIAHIO-1;11491;610;3;40;2
    53;17;GADOUAN-2;7472;610;3;80;8
    53;23;KIBOUO-3;7593;610;3;80;6
    53;13;BOGUEDIA-1;7351;610;2;80;2
    53;47;IBOGUHE-2;14432;610;4;0;7
    53;47;IBOGUHE-3;14433;610;2;60;0 
    $ 
    1
  2. Utilisateur anonyme
     
    salut,

    tu dois utiliser la commande 'join' (peut-être plusieurs fois).
    man join
    0
  3. GHISLINO Messages postés 214 Date d'inscription   Statut Membre Dernière intervention  
     
    salut ,

    je regarde le man de join et je reviens

    merci pour le tuyau
    0
  4. GHISLINO Messages postés 214 Date d'inscription   Statut Membre Dernière intervention  
     
    salut ,
    le join ne m' n est pas approprie a mes besoins

    j ai essaye plutot ceci

    for x in $(cat fichier3.conf); do
    ref=$(echo $x | cut -d';' -f 1)
    trx=$(echo $x | cut -d';' -f 2)
    tre=$(echo $x | cut -d';' -f 3)

    for x in $(cat fichier2.conf); do
    ref=$(echo $x | cut -d';' -f 1)
    cel=$(echo $x | cut -d';' -f 3)
    ci=$(echo $x | cut -d';' -f 4)

    if [grep -w $ref fichier2 == grep -w $ fichier3] && grep -w $ci fichier2

    then

    cat fichier | cut -d";" -f 1,2 | sed -e 's/$/;'$tre'/' >>fichierfinal

    fi

    done
    done
    0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. Utilisateur anonyme
     
    n'y aurait-il pas un problème dans le format du fichier1 ?
    le séparateur de champs n'est pas toujours le point virgule, contrairement à ce que montre l'en-tête.
    idbs;idbt;cel;ci;lac;trx;taux
    ......................^
    53;45;LOURIA-1;14391,610;2;80
    ..................................^
    c'est normal?
    0
  7. GHISLINO Messages postés 214 Date d'inscription   Statut Membre Dernière intervention  
     
    c est juste une petite erreur qui s'est glisse modifiable par la commande

    cat fichier1 | sed s/','/';'/g >> fichier1bis

    merci pour la remarque
    0
  8. GHISLINO Messages postés 214 Date d'inscription   Statut Membre Dernière intervention  
     
    bonjour a tous

    avec quelque recherche j ai pu faire correspondre le fichier2 et le fichier3 qui ont c pour point cummun le champ ref donc avec ce petit script j ai pu faire la correspondance entre le champ ref du fichier3 avec le champ ci du fichier2:

    for x in $(cat fichier2); do
    ref1=$(echo $x | cut -d';' -f 1)
    lac=$(echo $x | cut -d';' -f 2)
    ci=$(echo $x | cut -d';' -f 3)
    cel=$(echo $x | cut -d';' -f 4)

    cat fichier3 | grep -w $ref1 | sed -e 's/'$ref1'/'$ci'/' >> ref.txt

    done

    et j obtiens

    le fichier ref.txt suivant

    ref.txt
    ci,trx,tre
    14391,1,2
    14391,2,1
    7843,3,9
    7843,1,5
    7843,2,6
    11491,2,3
    11491,1,1
    11491,3,2
    7472,2,7
    7472,1,6
    7472,3,8
    7593,3,6
    7593,1,5
    7593,2,8
    7351,2,2
    7351,1,1
    14432,3,8
    14432,4,7
    14432,1,10
    14432,2,4
    14432,3,0
    14432,1,0
    14432,2,0

    la manip consiste maintenantnt a faire la correspondance des champs ci et trx du fichier ref.txt avec les champs ci et trx du fichier1 ci dessous
    il faut que les deux conditions soient respecte (ci et trx)
    fichier1
    idbs;idbt;cel;ci;lac;trx;taux
    53;45;LOURIA-1;14391;610;2;80
    53;7;GABIA_ISSIA-3;7843;610;2;10
    53;12;NAKIAHIO-1;11491;610;2;0
    53;12;NAKIAHIO-1;11491;610;3;40
    53;17;GADOUAN-2;7472;610;3;80
    53;23;KIBOUO-3;7593;610;3;80
    53;13;BOGUEDIA-1;7351;610;2;80
    53;47;IBOGUHE-2;14432;610;4;0
    53;47;IBOGUHE-3;14433;610;2;60

    donc sur une ligne recherche ci et trx du fichier1 dans le fichier ref.txt si tu trouve la correspondance alors ajoute le champ tre devant la ligne qui correspond dans le fichier1

    voila un peu ce que le script doit faire
    merci d'avance pour vos reponse
    0
  9. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    si je prends les 2 premiers cas, je ne comprends pas la dernière valeur,
    dans fichier 3, il y a plusieurs choix, lequel faut-il prendre ?
    le lien entre ficher1 et fichier2 c'est cel et le lien entre fichier2 et fichier3 c'est ref ?
    Fichier1 
    idbs;idbt;cel;ci;lac;trx;taux 
    53;45;LOURIA-1;14391,610;2;80 
    53;7;GABIA_ISSIA-3;7843,610;2;10 
    Fichier 2 
    ref;lac;ci;cel 
    14000;610;14391;LOURIA-1 
    10068;610;7843;GABIA_ISSIA-3 
    Fichier3 
    ref,trx,tre 
    14000,1,2 
    14000,2,1 
    10068,3,9 
    10068,1,5 
    10068,2,6 
    je veux obtenir un fichier final comme ceci 
    Fichierfinal 
    idbs;idbt;cel;ci;lac;trx;taux;tre 
    53;45;LOURIA-1;14391,610;2;80;2 
    53;7;GABIA_ISSIA-3;7843,610;2;10;6 
    
    0
  10. GHISLINO Messages postés 214 Date d'inscription   Statut Membre Dernière intervention  
     
    salut

    en fait le fichier est faux car il faut respecter les champs ci dans les fichier1 et fichier2 mais aussi les champ trx dans le fichier1 et fichier3 pour trouver le fichier final avec ajout du tre correspondant

    donc le fichier final tu auras

    idbs;idbt;cel;ci;lac;trx;taux;tre
    53;45;LOURIA-1;14391,610;2;80;1
    53;7;GABIA_ISSIA-3;7843,610;2;10;6
    0
    1. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
       
      je vois mieux, il me manquait un champ,mais j'ai lu le post #5 et remplacé la virgule
      0
  11. GHISLINO Messages postés 214 Date d'inscription   Statut Membre Dernière intervention  
     
    salut dubeck
    merci beaucoup pour le tuyau en effet j 'ai trouver ou ca clochait c 'etait les virgules du fichier3 que je n avais pas modifie en point virgule.
    merci encore c est super.
    mais peux tu m expliquer un peu car il faut que je comprenne pour que je puisse voler de mes propes ailes
    merci d'avance

    awk -F";" 'FNR==1{f++} f==1{f3[$1, $2]=$3} f==2{f2[$3]=$1} f==3{printf $0 FS f3[f2[$4], $6] "\n"}' fichier3 fichier2 fichier1

    ce que j ai compris :

    -F";" pour definir le separateur ;

    FNR==1 le nombre d'enregitrement a la sortie

    {f++} plusieurs lignes d'enregistrement

    f==1{f3[$1, $2]=$3} le fichier1 est egale au fichier a condition que le champ $1 et $2 soit verifier dans le fichier1 alors est egale $3 du fichier3

    voila ce que j ai pu comprendre dan ce code merci de me corriger

    cdlt.
    0
  12. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    -F";"  on definit le séparateur de champ
    FNR==1{f++} FNR égale 1 quand on débute le traitement d'un fichier, donc f=1 pour fichier3, 2 pour fichier2, etc
    f==1{f3[$1, $2]=$3} on traite fichier3, on stocke dans un tableau f3[ref, trx]=tre
    f==2{f2[$3]=$1} pour fichier2, on stocke f2[ci]=ref
    f==3{printf $0 FS f3[f2[$4], $6] "\n"}' on imprime fichier1 en ajoutant le taux dans f3, indexé par ref dans f2 et trx (champ 6) dans fichier1
    
    0