IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

[ksh] Concatenation 2 fichiers


Sujet :

Linux

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 145
    Points : 68
    Points
    68
    Par défaut [ksh] Concatenation 2 fichiers
    Bonjour,

    Je viens vers vous pour vous demander un coup de main sur un script que je dois réaliser sur un serveur unix en ksh.

    J'ai deux fichiers que je dois concatener en ligne en un seul.

    Le premier fichier est crée comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mag;code_art;campagne;st_juillet;st_aout;etc
    Le deuxième fichier est crée comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    code_art;campagne;pma_juillet;pma_aout;etc
    et le fichier final doit etre comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mag;code_art;campagne;st_juillet;st_aout;etc;pma_juillet;pma*_aout;etc...

    Si vous pouviez m'aider ce serait extra parceque la je suis paumé depuis la première ligne

    Merci d'avance à tous

    Steph70

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 559
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 559
    Points : 19 400
    Points
    19 400
    Par défaut
    en ksh, je ne sais pas...
    en bash
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    cat Steph70-{1,2}-20090806.dat
    mag;code_art;campagne;st_juillet;st_aout;etc
    code_art;campagne;pma_juillet;pma_aout;etc
     
    echo "$(<Steph70-1-20090806.dat);$(<Steph70-1-20090806.dat)..."
    mag;code_art;campagne;st_juillet;st_aout;etc;mag;code_art;campagne;st_juillet;st_aout;etc...
    Existe-t-il un comportement équivalent en ksh...
    ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 145
    Points : 68
    Points
    68
    Par défaut
    Bonjour et merci

    Oui et non car la je n'ai en gros qu'un paste.

    Le but est avec les clés communes d'ecrire un fichier qui comprendrai la totalité des infos.

    Merci encore pour l'aide

    Amicalement
    Steph70

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Existe-t-il un comportement équivalent en ksh...
    ?
    Bah, t'as fait qu'un echo. C'est une commande assez commune à tous les shells....

    Citation Envoyé par steph70 Voir le message
    Bonjour et merci

    Oui et non car la je n'ai en gros qu'un paste.

    Le but est avec les clés communes d'ecrire un fichier qui comprendrai la totalité des infos.
    Ca peut se faire de façon très rapide à la condition que les fichiers soient tous deux triés sur la clef commune. L'algo à appliquer se nomme alors "appareillage" et marche pour "n" fichiers avec "p" lignes ayant la même clef (fichiers tous triés)
    L'algo est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    flag fichier1=vrai
    flag fichier2=vrai
    tant que infini
    faire
        si flag fichier 1 
        alors
              lire fichier 1 et stocker dans info1
              si EOF => sortie boucle
              flag fichier1=faux
        fin si
     
        si flag fichier 2
        alors
              lire fichier 2 et stocker dans info2
              si EOF => sortie boucle
              flag fichier2=faux
        fin si
     
        comparer clef info1 et clef info2
        si clef égales alors écrire info1 + info2
     
        si clef info1 <= clef info2 alors flag fichier1=vrai
        si clef info2 <= clef info1 alors flag fichier2=vrai
    fin tq
    Le principe est simple. Un pointeur par fichier. Tant que les pointeurs ne sont pas au même niveau, on lit le fichier qui a le pointeur le plus bas. L'algo va très vite (chaque fichier n'est traité qu'une fois en totalité) mais ne marche que si les fichiers sont triés.

    Si les fichiers ne sont pas triés, alors il faut revenir sur un algo brutor
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    tant que lire fichier 1 ne renvoie pas EOF
    faire
          récupérer clef
          tant que lire fichier 2 ne renvoie pas EOF
          faire
               récupérer la clef
               si clefs égales alors écrire info fichier 1 + info fichier2
          fin faire
    fin faire
    Là, le fichier2 est lu autant de fois qu'il y a de lignes dans le fichier 1. Bon, on peut utiliser le grep (ou le fgrep qui va plus vite) pour éviter la boucle interne mais au résultat, le traitement sera quand-même bien plus long...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2009
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2009
    Messages : 14
    Points : 21
    Points
    21
    Par défaut
    Typiquement, comme le dit Sve@r, si l'ordre n'a pas d'importance, et que tu peux trier tes entrées, tu peux utiliser sort(1) suivi de join(1). Quelque chose dans le genre de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $ sort -t \; -k 2 a >a.s
    $ sort -t \; -k 1 b >b.s
    $ join -t \; -1 2 -2 1 a.s b.s >c
    Après, si t'as besoin d'intervertir les champs 1 et 2, ça se fait facilement p.ex. avec awk(1).

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Février 2009
    Messages
    145
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 145
    Points : 68
    Points
    68
    Par défaut
    Bon voici la solution adoptée :

    1: Transformer code_art;campagne en code_art@campagne, et trier le fichier numeriquement sur le champ 2

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -r -e 's/;[[:space:]]*$//' -e 's/^([^;]+);([^;]+);([^;]+);(.*)$/\1;\2@\3;\4/' D_STO2.CSV |sort -n -t ';' -k 2 > fic1.mod
    2: Transformer code_art;campagne en code_art@campagne, et trier le fichier numeriquement sur le champ 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -r 's/^([^;]+);([^;]+);(.*)$/\1@\2;\3/' D_PMA2.CSV |sort -n -t ';' -k 1 > fic2.mod
    3: Joindre les fichiers sur les champ 2 du fichier 1 et 1 du fichier2, remettre le champ mag à la bonne place, et separer le champ code_art@campagne en deux champ distincts
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    join -1 2 -2 1 -t ';' fic1.mod fic2.mod | sed -r 's/^(.+)@([^;]+);([^;]+);(.*)$/\3;\1;\2;\4/' > STOCK.CSV
    Le gros souci avec cette méthode, c'est le temps de traitement qui depasse les 24 h.

    Il est vrai que le premier fichier comprend un peu plus de 440 000 lignes et le deuxième pas loin de 10 000.

    Si vous avez une idée pour réduire le temps de traitement ou encore une autre solution....

    Merci
    Amicalement
    Steph70

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 699
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 699
    Points : 30 999
    Points
    30 999
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par steph70 Voir le message
    Si vous avez une idée pour réduire le temps de traitement ou encore une autre solution....
    Ta solution de trier les fichier au départ sera toujours la meilleure. Maintenant ptet qu'on peut utiliser un autre langage (comme awk ou Python).
    Si les data de tes fichiers ne sont pas confidentielles, dépose-les sur un dépot (style dl.free.fr ou megaupload). Je les récupèrerai et regarderai...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Concaténer deux fichiers Ligne/Ligne avec SH
    Par guiltouf dans le forum Linux
    Réponses: 7
    Dernier message: 22/05/2007, 14h35
  2. Concaténer plusieurs fichier pdf.
    Par gege2061 dans le forum Linux
    Réponses: 7
    Dernier message: 28/10/2006, 13h14
  3. Supprimer les dernieres lignes et concatener plusieurs fichier
    Par filsdugrand dans le forum Shell et commandes GNU
    Réponses: 1
    Dernier message: 11/04/2006, 21h15
  4. Concaténation de fichiers sous UNIX?
    Par airmax77 dans le forum Linux
    Réponses: 4
    Dernier message: 27/01/2006, 16h23
  5. [Script .BAT] Concatenation de fichiers plats
    Par Jokeur dans le forum Autres langages
    Réponses: 1
    Dernier message: 03/05/2005, 12h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo