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 :

Intercaler une colonne d'un fichier dans un autre


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Par défaut Intercaler une colonne d'un fichier dans un autre
    Bonjour,

    J'ai un fichier_1 composé d'une seule colonne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    COL_1_FIC_1
    AZERTY
    QSDFG
    WXCVB
    J'ai un second fichier_2 composé de 3 colonnes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    COL_1_FIC_2   COL_2_FIC_2      COL_3_FIC_2
    ABC                123                10292
    ABC                456                2030Z
    ABC                789                20304
    Je souhaite intercaler la colonne de mon fichier_1 entre deux colonnes du fichier_2. Ce qui peut ressembler à ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    COL_1_FIC_2   COL_2_FIC_2         COL_1_FIC_1           COL_3_FIC_2     
    ABC                123                 AZERTY            10292              
    ABC                456                 QSDFG              2030Z              
    ABC                789                 WXCVB             20304
    La commande unix paste permet fusionner les colonnes en mettant la colonne du fichier_1 soit au début ou à la fin du fichier_2 mais pas ailleurs.
    Une idée ?

    Merci infiniment

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    Bonjour,

    ici ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    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 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Taxan Voir le message
    La commande unix paste permet fusionner les colonnes en mettant la colonne du fichier_1 soit au début ou à la fin du fichier_2 mais pas ailleurs.
    Une idée ?
    Bonjour
    Oui, une idée (pas bien compliqué d'ailleurs) : utiliser cut pour découper le fichier 2 en deux fichiers 2A (2 colonnes) et 2B (une colonne) puis utiliser paste sur le fichier 2A, le fichier 1 et le 2B.

    Ca c'est la méthode la plus simple à concevoir et donc la plus "bas de gamme". Tu peux aussi envoyer le paste de tes deux fichiers initiaux (donc t'auras tes 4 infos dans un ordre qui ne te convient pas) sur une commande awk qui se chargera, elle, de remettre les 4 infos dans le bon ordre. Un peu dans ce style paste fichier_1 fichier_2 |awk '{printf("%s %s %s %s\n", $2, $3, $1, $4)}'...
    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]

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    32
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 32
    Par défaut
    Je vous remercie pour vos retours.
    Le besoin est rendu un peu plus complexe. Je vais essayer d'être clair :

    J'ai toujours mon fichier_1 dont le nombre de champs est variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CHAMP1_1|CHAMP1_2|CHAMP1_3|..........|CHAMP_1_N
    Mon second fichier_2 dont le nombre de champs est variable aussi mais il est forcément égal au nombre de champs du fichier_1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    VAL1_1|VAL1_2|VAL1_3|..........|VAL1_N
    VAL2_1|VAL2_2|VAL2_3|..........|VAL2_N
    VAL3_1|VAL3_2|VAL3_3|..........|VAL3_N
    Mon objectif est d'obtenir ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CHAMP1_1|VAL1_1|CHAMP1_2|VAL1_2|CHAMP1_3|VAL1_3......|CHAMP_1_N|VAL1_N
    CHAMP1_1|VAL2_1|CHAMP1_2|VAL2_2|CHAMP1_3|VAL2_3......|CHAMP_1_N|VAL2_N
    CHAMP1_1|VAL3_1|CHAMP1_2|VAL3_2|CHAMP1_3|VAL3_3......|CHAMP_1_N|VAL3_N
    En réalité, dans le fichier_1, j'ai ma liste de champs et dans le second fichier_2, les valeurs associées à cette liste de champs.
    Donc, ma liste de CHAMP_X_Y se répète autant de fois qu'il y a de lignes dans le second fichier.

    Désolé chers experts de vous déranger à nouveau. J'espère que ma demande est plus claire.
    Merci pour votre aide.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    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 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Taxan Voir le message
    Je vous remercie pour vos retours.
    Le besoin est rendu un peu plus complexe. Je vais essayer d'être clair :
    C'aurait été bien de l'être dès le départ. Nous, on ne peut se baser que sur ce que tu dis quoi...

    Citation Envoyé par Taxan Voir le message
    J'ai toujours mon fichier_1 dont le nombre de champs est variable
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CHAMP1_1|CHAMP1_2|CHAMP1_3|..........|CHAMP_1_N
    Mon second fichier_2 dont le nombre de champs est variable aussi mais il est forcément égal au nombre de champs du fichier_1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    VAL1_1|VAL1_2|VAL1_3|..........|VAL1_N
    VAL2_1|VAL2_2|VAL2_3|..........|VAL2_N
    VAL3_1|VAL3_2|VAL3_3|..........|VAL3_N
    Mon objectif est d'obtenir ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    CHAMP1_1|VAL1_1|CHAMP1_2|VAL1_2|CHAMP1_3|VAL1_3......|CHAMP_1_N|VAL1_N
    CHAMP1_1|VAL2_1|CHAMP1_2|VAL2_2|CHAMP1_3|VAL2_3......|CHAMP_1_N|VAL2_N
    CHAMP1_1|VAL3_1|CHAMP1_2|VAL3_2|CHAMP1_3|VAL3_3......|CHAMP_1_N|VAL3_N
    En réalité, dans le fichier_1, j'ai ma liste de champs et dans le second fichier_2, les valeurs associées à cette liste de champs.
    Un poil plus compliqué mais pas vraiment plus...

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    paste fichier1 fichier2 -d\| |awk -F\| '{for (i=1; i <= NF/2; i++) printf("%s|%s|", $i, $(i+NF/2)); printf("\n");}' |sed -e "s/|$//"
    Explication
    Le paste va te coller chaque ligne du fichier1 au fichier 2 en les séparant par un pipe (le délimiteur interne de tes fichiers).
    Le résultat va être envoyé à un awk qui utilisera le pipe pour séparer les champs. Donc si chaque fichier a 5 champs, le awk en recevra 10 (ce nombre étant récupérable par la variable "NF" "Number of Fields")
    Ensuite il lui suffit de demander d'afficher le champ 1 avec le champ 6, le champ 2 avec le champ 7 et etc jusqu'à 5 donc en fait faire une boucle sur i allant de 1 à NF/2 et d'afficher le champ "i" suivi du champ "i+NF/2". Puis en final une petite fin de ligne.
    Comme cette boucle affiche un pipe à chaque couple de champs, la ligne se termine donc par un pipe inutile. J'aurais pu complexifier le code awk pour qu'il gère le cas particulier du dernier champ mais je préfère envoyer ça à sed pour lui demander de supprimer ce pipe final. Je te dis ça parce que d'autres préfèrent éviter les chainages de commandes quand c'est possible et que leurs choix est tout aussi respectable (surtout que dans ce cas ce n'aurait pas été très difficile de le faire faire par awk)

    Tu devrais te familiariser avec la commande awk. Elle est vraiment puissante quand il faut manipuler un fichier texte de façon un poil complexe...
    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]

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 635
    Par défaut
    je n'ai pas testé, mais, a priori, ça devrait fonctionner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #!/bin/bash
     
    IFS='|' read -a ar1 < fic_1
     
    while IFS='|' read -a ar2
    do
       for i in ${!ar1[@]}
       do  
          printf '%s|%s' "${ar1[i]}" "${ar2[i]}"
       done
       echo
    done < fic_2
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -F'|' 'BEGIN{getline < "fic_1"; split($0,a,"|")}{for(i=1;i<=NF;i++)printf("%s|%s",a[i],$i);print ""}' fic_2
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 801
    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 801
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    je n'ai pas testé, mais, a priori, ça devrait fonctionner :
    Les deux fonctionnent sauf qu'aucun des deux ne positionne le pipe nécessaire entre le champ pair du couple x et le champ impair du couple x+1

    Dans le premier code, il faut rectifier par ceci printf '%s|%s|' "${ar1[i]}" "${ar2[i]}" et dans le second par cela printf("%s|%s|",a[i],$i). Ensuite, il faut bien entendu trouver un moyen pour soit supprimer le dernier pipe de la ligne (typiquement un boulot pour sed) soit ne pas le mettre (rajouter par exemple le pipe en tant qu'élément variable du awk et ne pas l'afficher quand i vaut NF).

    Ceci dit, sincèrement, tu ne trouves pas que le mien est quand-même un peu plus lisible ???
    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]

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

Discussions similaires

  1. [XL-2013] Copier cellules en ligne dans une colonne qui se trouve dans un autre classeur
    Par Wushugringo dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/02/2015, 08h07
  2. Réponses: 2
    Dernier message: 26/03/2013, 13h43
  3. [XL-2003] Sélectionner une liste dans une colonne et la reporter dans un autre fichier
    Par bentor22 dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 29/01/2013, 14h22
  4. Réponses: 2
    Dernier message: 23/11/2012, 16h20
  5. [Toutes versions] Copier une colonne d'un fichier Excel dans un fichier TEXT.
    Par jerem_orga dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/08/2010, 23h41

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