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 :

différentes commandes bash


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 30
    Par défaut différentes commandes bash
    Bonjour !
    Voila je voudrais joindre 2 fichiers comportant chacun une chaine en commun.
    Pour cela j'ai essayé d'utiliser la commande join. J'ai auparavant trié les fichiers avec "sort" puis :

    Là aucun résultat...
    J'ai essayer de rediriger vers un autre fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    join fichier1 fichier2 > fichier3
    Sans resultat.

    J'explique mon objectif premier.
    J'ai 2 fichiers.
    Fichier1 :

    Fichier2:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    id1;hypotheque
    id2;achat
    id2;location
    id2;vente
    id3;vente
    id4;location

    Le résultat que je souhaite obtenir :

    id2;maison;34;achat
    id2;maison;34;location
    id2;maison;34;vente

    si vous pouviez me guider
    Merci !

  2. #2
    Membre éclairé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Août 2007
    Messages
    509
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Août 2007
    Messages : 509
    Par défaut
    Regarde du coté des options de join. Ca peut t'aider

  3. #3
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    ... plus particulièrement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
           -t CAR utiliser CAR comme délimiteur de champs pour l’entrée et la sortie

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 30
    Par défaut
    Ok merci nikel !
    Et oui j'avais oublié les délimiteurs de champ

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 30
    Par défaut
    Nouveau petit problème :
    Cette fois ci j'ai plusieurs lignes différentes dans le fichier 1 et je voudrais joindre avec le fichier qu'une seule ligne dont je connais un motif.

    Fichier 1:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    id2;maison;34
    id3;cabane;23
    voici mon début:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep id2 fichier1 | join -t ";" fichier1 fichier2
    Mais il ne prend pas en compte le grep effectué avant...

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 662
    Par défaut
    es-tu sûr de ne pas encore devoir lire la page de man
    ...
    ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 30
    Par défaut
    mes pages de man sont toutes en anglais

    quand je met :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    join -t ";" -j "id2" fichier1 fichier2
    Il me répond :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    join: numéro de champ invalide: `id2'

  8. #8
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Tu as un man plus détaillé dans $ info coreutils join.

    Pour rediriger la sortie d'une commande vers join tu peux faire comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep id2 fichier1 | join -t";" - fichier2
    awk peut aussi marcher pour ce type de problème. Il présente même l'avantage de ne pas devoir trier les fichiers avant le join.

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 30
    Par défaut
    ok merci bien mais je comprend pas a quoi sert - avant fichier2
    C'est une option ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 662
    Par défaut
    Ça sert à indiquer à certains programmes (dont join) d'utiliser l'entrée standard (ici, ce qui sort du pipe) plutôt qu'un fichier.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 30
    Par défaut
    ok merci !
    Dernier petit détail que faire si je souhaite faire cette opération :

    maison;35
    appart;23
    cabane;3
    cabane;5
    maison;6

    pour avoir :

    maison;41
    appart;23
    cabane;8

    j'ai essayé en utilisant la commande uniq mais comment faire pour appliquer l'addition des nombres pour chaque champs différent ?

    Merci de votre aide.

  12. #12
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Là, tu auras besoin de awk:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     awk -F";"  -v OFS=";" '{t[$1]+=$2}END{for(i in t) print i, t[i]}' fichier

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 30
    Par défaut
    ok merci nikel, j'aurais juste besoin de quelques explication ^^

    donc :

    -F pour le séparateur de champ

    la ok mais après fraudais me dire ce que ça fait...
    Merci.

  14. #14
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    OFS est le séparateur de sortie (pour le print).

    A chaque ligne du fichier on incrémente la valeur du tableau t[indice=première colonne] par la deuxième colonne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    END{for(i in t) print i, t[i]}
    A la fin, quand tout le fichier a été parcouru, on traverse le tableau t[] et on imprime l'indice (première colonne) et sa valeur qui contient maintenant le total.

  15. #15
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 30
    Par défaut
    Ok, donc si j'ai bien compris ça créer un tableau pour chaque champ $1 dans lequel on ajoute a chaque fois la valeur du champ $2.

    La ou j'ai des doutes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    END{for(i in t) print i, t[i]}
    le "in t" signifie t-il jusqu'à la fin du tableau ?
    Et pour le print, je ne comprend pas comment i prend la valeur de $1...

    Et pour OFS il est compris dans l'option -v ?
    Parce que normalement -v est utiliser pour définir des variable ; non ?

  16. #16
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Citation Envoyé par Suefou Voir le message
    Ok, donc si j'ai bien compris ça créer un tableau pour chaque champ $1 dans lequel on ajoute a chaque fois la valeur du champ $2.
    Un seul tableau t qui prend le premier champ ($1) comme indice et le cumul du deuxième champ ($2) comme valeur.

    Citation Envoyé par Suefou Voir le message
    La ou j'ai des doutes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    END{for(i in t) print i, t[i]}
    le "in t" signifie t-il jusqu'à la fin du tableau ?
    Et pour le print, je ne comprend pas comment i prend la valeur de $1...
    Avec la structure for (i in t) awk va itérer sur les indices du tableau t et les retourner, un par un, dans la variable i. Comme, plus haut tu stockes $1 comme indice du tableau, il est logique qu'il se retrouve affecté à i.

    Citation Envoyé par Suefou Voir le message
    Et pour OFS il est compris dans l'option -v ?
    Parce que normalement -v est utiliser pour définir des variable ; non ?
    Oui, OFS est une variable comme une autre. Tu pourrais aussi la définir, ainsi que FS d'ailleurs, dans un bloc BEGIN. Même effet.

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2009
    Messages : 30
    Par défaut
    Ben c'est ok
    Merci beaucoup !

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

Discussions similaires

  1. GVIM lent avec certaines commandes bash
    Par nakolah dans le forum Gnome
    Réponses: 0
    Dernier message: 29/04/2009, 10h04
  2. Associer différentes commandes à un bouton de menu
    Par nonozor dans le forum Tcl/Tk
    Réponses: 9
    Dernier message: 02/05/2008, 21h16
  3. [Système] Une variable PHP dans une commande bash
    Par aroua dans le forum Langage
    Réponses: 1
    Dernier message: 19/07/2007, 16h23
  4. Réponses: 5
    Dernier message: 01/07/2007, 20h25
  5. Extraire des lignes d'un fichier en commande bash
    Par newnew dans le forum Linux
    Réponses: 3
    Dernier message: 27/07/2004, 16h22

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