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 :

intersection liste script bash


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut intersection liste script bash
    Bonjour à tous,
    J'ai ecris ce petit script bash :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #!/bin/sh
     
    "ma commande a executer > output.bam"
    liste1=`cat "output.bam" | cut -f 3 | cut -f1 -d ';' | sort -u`
     
    "ma commande 2 a executer > output2.bam"
    liste2=`cat "output2.bam" | cut -f 3 | cut -f1 -d ';' | sort -u`
    Je cherche maintenant à regarder la valeur de l'intersection de mes deux listes, j'ai donc fait comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    value=`comm -12 $liste1 $liste2 | uniq | wc -l`
    Mais cela ne fonctionne pas, j'obtiens l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    comm: opérande supplémentaire «FBgn0000057»
    Saisissez «*comm --help*» pour plus d'informations.
    FBgn0000057 etant un element de ma liste1 ....
    Quelqu'un aurait une idée ?
    Merci d'avance

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

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

    comm opère sur des fichiers, et vu que tu as déjà deux fichiers temporaires, on ne va pas en ajouter; mais ce ne sera pas aussi simple :
    il va falloir utiliser un descripteur de fichier supplémentaire (càd, en plus de stdin, stdout et stderr)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read line1; do read <&3 line2; test "$line1" = "$line2" && echo "$line1"; done <fichier1 3<fichier2
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut
    Merci pour ta réponse,
    je suis débutante et je ne comprends pas tout ce que tu fais :
    - à quoi correspond : - que fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test "$line1" = "$line2" && echo "$line1"
    et enfin,
    - que fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    done <fichier1 3<fichier2
    ?

    Merci d'avance pour tes explications

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    on va commencer par la fin, car en fait c'est le début de tout
    et enfin,
    - que fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    done <fichier1 3<fichier2
    pour le fichier1, regarde ceci : Comment lire un fichier
    le fichier2, lui, est rédirigé vers le descripteur de fichier n° 3
    il y a normalement 3 descripteur de fichiers
    • stdin : 0 : l'entrée standard (typiquement le clavier)
    • stdout : 1 : la sortie standard (typiquement l'écran)
    • stderr : 2 : la sortie d'erreur (typiquement l'écran aussi, mais distinct de stdout, pour continuer de s'afficher à l'écran lorsque stdout est redirigé)
    on peut en ajouter arbitrairement. Ici j'utilise le n°3.
    c'est nécessaire car l'entrée standard de la boucle while est prise par la redirection du fichier1.

    - à quoi correspond :
    read va lire la redirection du descripteur de fichier n°3 vers lequel on a redirigé le fichier2.

    - que fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test "$line1" = "$line2" && echo "$line1"
    bah!? c'est un test ! s'il est vrai (&&) l'action suivante est exécutée.
    j'aurais pu écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if test "nanana"; then echo "bla bla"; fi
    mais comme il n'ya qu'une action, j'utilise une forme courte.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Par défaut
    Merci pour ces explications.
    Mais alors je peux donner en entrée $liste1 et $liste2 ou il fait que je crée des fichiers temporaire ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    Par défaut
    ah, oui! dis donc, j'avais zappé ce problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    exec 3<<eof
    $(cut -f 3 output.bam | cut -f1 -d ';' | sort -u)
    eof
    exec 4<<eof
    $(cut -f 3 output2.bam | cut -f1 -d ';' | sort -u)
    eof
     
    while read <&3 line1
    do read <&4 line2
       test "$line1" = "$line2" && echo "$line1"
    done
    non mais (j'ai un peu galéré, c'est pas du bash )

    deux choses encore:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo a b c | cut -f 3
    a b c
    il faut un délimiteur!

    les commandes cut/sort étant les même utilise une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    traitement() { cut -d ' ' -f3 "$1" | cut -d';'  -f1 | sort -u;}
    exec 3<<eof
    $(traitement output.bam)
    eof
    ...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. Requête POST dans un script bash
    Par desperado dans le forum Linux
    Réponses: 4
    Dernier message: 11/12/2007, 22h38
  2. Réponses: 21
    Dernier message: 29/09/2005, 19h33
  3. Script bash : Pb avec sed
    Par fred64 dans le forum Linux
    Réponses: 3
    Dernier message: 19/08/2005, 11h24
  4. Scripts bash : requêtes sql
    Par milka dans le forum Linux
    Réponses: 3
    Dernier message: 17/08/2005, 10h59
  5. Problème script Bash
    Par Sphost dans le forum Linux
    Réponses: 10
    Dernier message: 26/07/2005, 09h56

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