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

Shell et commandes GNU Discussion :

Comment concatener toutes les lignes d'un fichier avec toutes les autres d'un autre ?


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut Comment concatener toutes les lignes d'un fichier avec toutes les autres d'un autre ?
    Bonjour,

    J'ai deux fichiers texte qui contiennent chacun d'eux des données dont voici un exemple :

    Fichier 1 :Fichier 2:
    Je voudrais créer un troisième fichier qui contient le mélange des deux de cette forme :
    Fichier 3 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    aaa.eee
    aaa.fff
    aaa.ggg
    aaa.hhh
    bbb.eee
    bbb.fff
    bbb.ggg
    bbb.hhh
    etc...
    Pour chaque lignes du fichier 1, je voudrais ajouter un "." puis l'ensemble des lignes du fichier 2 comme expliqué ci-dessus.

    Savez-vous avec quelles commandes puis-je réaliser ce genre de pirouette ?

    Merci par avance pour votre aide,
    ZiP

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 987
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 987
    Par défaut
    La première chose qui me vient à l'esprit est d'utiliser awk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'NR==FNR{a[i++]=$0;next}{for(j=0;j<i;j++){print $0"."a[j]}}' file2 file1
    Quand la condition NR==FNR est vrai (le nombre d'enregistrements lus, aka lignes lues, totale est égal au nombre d'enregistrements du fichier, la ligne est stockée dans le tableau associatif a et a pour clef i. Cette condition est vrai uniquement lorsque file2 est lu, car lorsque commence la lecture de file1, FNR (File Number Row) est réinitialisé et à ce moment là on applique la boucle for pour afficher chaque enregistrement de file1 suivi d'un point et de a[j].

  3. #3
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Bonjour,

    Merci pour votre aide !

    Je ne suis pas très à l'aise avec la console linux.

    Je viens de tester votre commande, le print $0 ne semble pas marcher car la ligne commence par un "." suivi du contenu du fichier 1.

    A moins que je n'ai pas bien compris.

    Je vais essayer de corriger ça.

    Merci beaucoup !

    ZiP

  4. #4
    Membre chevronné
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Par défaut
    Salut, perso je ferais 2 boucles :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    # Lecture du fichier2 qui est mis dans un tableau, 1 élément = 1 ligne
    mapfile -t VariableFichier2 < Fichier2.txt
     
    # Lecture du fichier1 ligne par ligne
    while read LigneFichier1
    do
      # Lecture du tableau élément par élément
      for LigneFichier2 in "${VariableFichier2[@]}"
      do
        # Envoie de la sortie voulue dans le fichier3
        echo "${LigneFichier1}.${LigneFichier2}" >>  Fichier3.txt
      done
    done < Fichier1.txt
    je n'imbrique pas les while read car c'est le bordel après, il faut jouer sur les entrées.

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 376
    Par défaut
    Pour le fun:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while read line
    do
      xargs -a fichier2 printf "${line}.%s\n"
    done <fichier1

  6. #6
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 162
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 162
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Pour le fun
    Encore plus fun (merci pour le code de base -- c'est Noël, les cadeaux pleuvent, ), et en plus ça répond au cahier des charges,
    Citation Envoyé par [ZiP] Voir le message
    Je voudrais créer un troisième fichier qui contient le mélange des deux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read line; do xargs -a fichier2 printf "${line}.%s\n"; done <fichier1 >> fichier3

  7. #7
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par hizoka Voir le message
    je n'imbrique pas les while read (...)
    c'est dommage ça fonctionne bien
    Code script : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while read line1; do
       while read line2; do
          echo "$line1.$line2"
       done < fichier2
    done < fichier1 > fichier3
    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
    $ bash script
    $ cat f3
    aaaa.eeee
    aaaa.ffff
    aaaa.gggg
    aaaa.hhhh
    bbbb.eeee
    bbbb.ffff
    bbbb.gggg
    bbbb.hhhh
    cccc.eeee
    cccc.ffff
    cccc.gggg
    cccc.hhhh
    dddd.eeee
    dddd.ffff
    dddd.gggg
    dddd.hhhh
    sinon pour reprendre l'idée de Flodelarab :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    join -j2 -o 1.1 2.1 f1 f2 | tr ' ' '.'
    bonnes fêtes à tous 🎅

  8. #8
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Bonjour,

    Je dois avoir un problème...

    Je n'ai pas le même résultat que vous :
    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
    zip@zip:/var/www/html/tmp$ cat f1.txt 
    aaa
    bbb
    ccc
    zip@zip:/var/www/html/tmp$ cat f2.txt 
    ddd
    eee
    fff
    zip@zip:/var/www/html/tmp$ cat fusion.sh 
    while read line1; do
       while read line2; do
          echo "$line1.$line2"
       done < f2.txt
    done < f1.txt
    zip@zip:/var/www/html/tmp$ ./fusion.sh 
    .ddd
    .eee
    .ddd
    .eee
    C'est bien étrange tout ça...

    ZiP

  9. #9
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Bonjour,

    Avec ce code :
    Citation Envoyé par BufferBob Voir le message
    sinon pour reprendre l'idée de Flodelarab :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    join -j2 -o 1.1 2.1 f1 f2 | tr ' ' '.'
    J'ai le résultat suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    zip@zip:/var/www/html/tmp$ join -j2 -o 1.1 2.1 f1.txt f2.txt | tr ' ' '.'
    .ddd
    .eee
    .fff
    .ddd
    .eee
    .fff
    ccc.ddd
    ccc.eee
    ccc.fff
    Merci,
    ZiP

  10. #10
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 297
    Par défaut
    Citation Envoyé par [ZiP] Voir le message
    Bonjour,
    Je viens de tester votre commande, le print $0 ne semble pas marcher car la ligne commence par un "." suivi du contenu du fichier 1.
    Ce que tu n'as pas compris, c'est que tu as une ligne vide et que quand tu fais le produit cartésien que tu demandes, la ligne vide avec le fichier 1 donne le fichier 1. Tout est normal.

    Bonjour,

    Je dois avoir un problème...
    Hizoka avait pourtant bien pris le temps de ne pas mettre 2 redirections pour t'éviter les problèmes.
    Il faudrait ouvrir un canal perso pour le fichier 2.


    Mais plutôt que de se prendre le chou, prends donc la solution avec awk 4 fois plébiscitée.

    ☃ Joyeux noël ! ☃

  11. #11
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Ce que tu n'as pas compris, c'est que tu as une ligne vide et que quand tu fais le produit cartésien que tu demandes, la ligne vide avec le fichier 1 donne le fichier 1. Tout est normal.


    Hizoka avait pourtant bien pris le temps de ne pas mettre 2 redirections pour t'éviter les problèmes.
    Il faudrait ouvrir un canal perso pour le fichier 2.


    Mais plutôt que de se prendre le chou, prends donc la solution avec awk 4 fois plébiscitée.

    ☃ Joyeux noël ! ☃
    Bon, je jette l'éponge...

    Je vais essayer de trouver comment convertir mon fichier et faire marcher votre exemple avec awk.

    Joyeux Noël à tous et merci quand même pour le temps accordé !

    ZiP

  12. #12
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 162
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 162
    Par défaut
    Citation Envoyé par [ZiP] Voir le message
    Bon, je jette l'éponge...

    Pas n'importe où ni n'importe comment, ça doit pouvoir se recycler :

    Citation Envoyé par [ZiP] Voir le message
    comment convertir mon fichier
    unix2dos et dos2unix sont tes amis, surtout le second, en l'espèce.

    Ne pas oublier qu'on ne peut pas mettre de l'essence dans un moteur Diesel et inversement.

  13. #13
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 162
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 162
    Par défaut
    si fic1.txt et fic2.txt sont créés sous Windows ça donne ça en rajoutant un retour-chariot à la fin de la dernière ligne (puisqu'il est absent), avant d'enregistrer
    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
    25
    26
    27
    # cat fic1.txt 
    aaa
    bbb
    ccc
    ddd
    # cat fic2.txt 
    eee
    fff
    ggg
    hhh
    # join -j2 -o 1.1 2.1 fic1.txt fic2.txt | tr ' ' '.'
    .eee
    .fff
    .ggg
    .hhh
    .eee
    .fff
    .ggg
    .hhh
    .eee
    .fff
    .ggg
    .hhh
    .eee
    .fff
    .ggg
    .hhh
    Et en enlevant ce retour-chariot pour me mettre en correspondance avec ce que tu nous donnes
    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
    # join -j2 -o 1.1 2.1 fic1.txt fic2.txt | tr ' ' '.'
    .eee
    .fff
    .ggg
    .hhh
    .eee
    .fff
    .ggg
    .hhh
    .eee
    .fff
    .ggg
    .hhh
    ddd.eee
    ddd.fff
    ddd.ggg
    ddd.hhh
    Donc en gros, il est interdit/impensable/inapproprié de traiter des fichiers Windows avec des outils Linux sans les avoir convertis au préalable, surtout quand les fichiers sont mal formés.

    Et en plus on dirait bien que tu utilises des fichiers source différents de ceux que tu as donnés dans ton 1er post...

    On n'y arrivera pas comme ça.

  14. #14
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Citation Envoyé par Jipété Voir le message
    si fic1.txt et fic2.txt sont créés sous Windows ça donne ça en rajoutant un retour-chariot à la fin de la dernière ligne (puisqu'il est absent), avant d'enregistrer
    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
    25
    26
    27
    # cat fic1.txt 
    aaa
    bbb
    ccc
    ddd
    # cat fic2.txt 
    eee
    fff
    ggg
    hhh
    # join -j2 -o 1.1 2.1 fic1.txt fic2.txt | tr ' ' '.'
    .eee
    .fff
    .ggg
    .hhh
    .eee
    .fff
    .ggg
    .hhh
    .eee
    .fff
    .ggg
    .hhh
    .eee
    .fff
    .ggg
    .hhh
    Et en enlevant ce retour-chariot pour me mettre en correspondance avec ce que tu nous donnes
    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
    # join -j2 -o 1.1 2.1 fic1.txt fic2.txt | tr ' ' '.'
    .eee
    .fff
    .ggg
    .hhh
    .eee
    .fff
    .ggg
    .hhh
    .eee
    .fff
    .ggg
    .hhh
    ddd.eee
    ddd.fff
    ddd.ggg
    ddd.hhh
    Donc en gros, il est interdit/impensable/inapproprié de traiter des fichiers Windows avec des outils Linux sans les avoir convertis au préalable, surtout quand les fichiers sont mal formés.

    Et en plus on dirait bien que tu utilises des fichiers source différents de ceux que tu as donnés dans ton 1er post...

    On n'y arrivera pas comme ça.
    Effectivement, mes fichiers sont créés avec Notepad++ sous Windows car je les édite via WinSCP sur un serveur Linux.

    Je suis perdu !

    ZiP

  15. #15
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par [ZiP] Voir le message
    mes fichiers sont créés avec Notepad++ (...) Je suis perdu !
    ça tombe bien, notepad++ a une option dans le menu édition -> convertir les sauts de ligne

  16. #16
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Merci pour vos réponses !

    J'ai converti mes fichiers et le awk fonctionne à merveille !

    Problème enfin résolu

    Joyaux Noël et merci pour le temps que vous m'avez consacré !!

    ZiP

  17. #17
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 162
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 162
    Par défaut
    Citation Envoyé par [ZiP] Voir le message
    Problème enfin résolu
    En voilà une histoire qui finit bien !

    Merci pour le retour complet, le bouton , toussa toussa,

    Quelle équipe

    Ça nous change du Mastermind...

  18. #18
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 297
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 297
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    ça tombe bien, notepad++ a une option dans le menu édition -> convertir les sauts de ligne
    Oui. Mais veut-on tirer la couverture à soi ?...

    (lookahead suspensif)

  19. #19
    Membre éprouvé
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    ça tombe bien, notepad++ a une option dans le menu édition -> convertir les sauts de ligne
    Merci pour l'information !

    ZiP

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/05/2016, 13h36
  2. Réponses: 2
    Dernier message: 04/11/2014, 15h36
  3. Remplacer les lignes d'un fichier excel par les lignes d'un autre fichier
    Par nandy.c dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 17/05/2013, 14h35
  4. afficher les lignes d'un fichier qui ne sont pas dans lun autre fichier
    Par israellita dans le forum Shell et commandes GNU
    Réponses: 16
    Dernier message: 11/03/2011, 11h39
  5. Lire les lignes d'un fichier avec csh
    Par nicolas581 dans le forum Linux
    Réponses: 4
    Dernier message: 24/03/2010, 16h38

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