Reunir 2 fichiers en un avec un script shell

Résolu
mlkndiaye -  
 mlkndiaye -
Bonjour,

j'ai 2 fichiers en entrées sous la forme:

fich1
654143|764|FACTURE NORD|LIVRE|
753282|627|RECEPTION DOUBLE|EXISTANT|
976376|897|ACION DEMANDER|RESERVER|

et fich2
654143|834Z7|
753282|D6735|
976376|76H76|

seullement la premiere colonne se resemble pour les deux fichiers.
JE VEUX AVOIR POUR RESULTAT UNE FICHIES fich3 DE LA FORME:

654143|764|FACTURE NORD|834Z7|LIVRE|
753282|627|RECEPTION DOUBLE|D6735|EXISTANT|
976376|897|ACION DEMANDER|76H76|RESERVER|

merci de m'aider pour concevoir ce script shell

5 réponses

  1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    man join

    $ cat fich1
    654143|764|FACTURE NORD|LIVRE|
    753282|627|RECEPTION DOUBLE|EXISTANT|
    976376|897|ACION DEMANDER|RESERVER|
    
    $ cat fich2
    654143|834Z7|
    753282|D6735|
    976376|76H76|
    
    $ join -t '|' -j1 1 -o '1.1 1.2 1.3 2.2 1.4' fich1 fich2
    654143|764|FACTURE NORD|834Z7|LIVRE
    753282|627|RECEPTION DOUBLE|D6735|EXISTANT
    976376|897|ACION DEMANDER|76H76|RESERVER
    
    $

    ;-))
    0
  2. mlkndiaye
     
    merci de ta reactivité.
    Mais je pense que c'est encore plus complexe:
    je croix que je me suis mal exprimé

    - le nombre de ligne des fichiers fich1 et fich2 varie
    - il peux y avoir une ligne manquante sur l'une des deux fichiers, les lignes manquantes sur l'un ou l'autre fichier doit etre redirgé dans un fichier rejet fich4
    - en fin fich3 resoit le resulte
    0
  3. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    hello
    j'ai rajouté une ligne dans chaque fichier
    $ cat a1
    654143|764|FACTURE NORD|LIVRE|
    753282|627|RECEPTION DOUBLE|EXISTANT|
    976376|897|ACION DEMANDER|RESERVER|
    00000|897|ACION DEMANDER|RESERVER|
    $ 
    $ cat a2
    654143|834Z7|
    753282|D6735|
    976376|76H76|
    99999|76H76|
    $ 
    $ awk 'BEGIN{FS=OFS="|"};NF<4 {x[$1]=$2;z[$1]=$0}; NF>4 {if(!x[$1]){print > "a4";next}; $3=$3 OFS x[$1];print;z[$1]=""};END{for(n in z)if(z[n])print z[n] > "a4"}' a2 a1
    654143|764|FACTURE NORD|834Z7|LIVRE|
    753282|627|RECEPTION DOUBLE|D6735|EXISTANT|
    976376|897|ACION DEMANDER|76H76|RESERVER|
    $ 
    $ cat a4
    00000|897|ACION DEMANDER|RESERVER|
    99999|76H76|
    $ 
    
    0
    1. mlkndiaye
       
      merci c'est exactement ce que je cherche.
      comme je m y connai pas awk , je veux apporter une modife sur le format du fichier:
      cat a1
      85884769370|01800|Moussa |sarr|01061982|SAINT LOUIS|17052010|
      08235367539|02900|Bassirou |DILLO|13081967|LOUGA|17052010|
      98545784521|02000|Babacar |DOUMBIA|31121955|THIES|17052010|
      53677448920|03500|Fatou |SILLA|27101965|COTE IVOIRE|17052010|
      15566728777|01700|ALI |DIOP|29031975|MALI|17052010|
      77992939257|00700|Bintou |NDIAYE|24041973|DAKAR|17052010|

      cat 2
      85884769370|030|
      08235367539|050|
      98545784521|051|
      53677448920|060|
      15566728777|070|
      77992939257|071|

      - Peut tu me modifier le script pour l'adapter?
      - je oudrais recupere dans a4 le resultat qui s'affachie a l'ecran
      0
    2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
       
      pour ces 2 lignes, ou faut-il placer le 030 ?
      85884769370|01800|Moussa |sarr|01061982|SAINT LOUIS|17052010|
      85884769370|030|

      pour placer la sortie dans un fichier ajouter: en bout de ligne
      awk ... > a3
      0
  4. mlkndiaye
     
    je me suis troumpe,
    - je oudrais recupere dans a3 le resultat qui s'affachie a l'ecran
    0
    1. mlkndiaye
       
      bonjour dubcek,
      je suis en attante merci d'avance.
      0
    2. mlkndiaye
       
      just apres le primer |
      cad: 85884769370|030|
      0
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 659
     
    $ awk 'BEGIN{FS=OFS="|"};NF<4 {x[$1]=$2;z[$1]=$0}; NF>4 {if(!x[$1]){print > "a4";next}; $2=x[$1] OFS $2;print;z[$1]=""};END{for(n in z)if(z[n])print z[n] > "a4"}' a2 a1 > a3
    $ 
    $ cat a3
    85884769370|030|01800|Moussa |sarr|01061982|SAINT LOUIS|17052010|
    08235367539|050|02900|Bassirou |DILLO|13081967|LOUGA|17052010|
    98545784521|051|02000|Babacar |DOUMBIA|31121955|THIES|17052010|
    53677448920|060|03500|Fatou |SILLA|27101965|COTE IVOIRE|17052010|
    15566728777|070|01700|ALI |DIOP|29031975|MALI|17052010|
    77992939257|071|00700|Bintou |NDIAYE|24041973|DAKAR|17052010|
    $
    
    0
    1. mlkndiaye
       
      Encore merci pour tout ,
      j'ai reusi a l'adapter et bonne journée
      0