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 :

Stockage commande grep dans une variable puis affichage


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut Stockage commande grep dans une variable puis affichage
    Bonjour à tous,
    J'ai deux fichiers.
    Un premier comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    128up-RA
    14-3-3epsilon-RA
    14-3-3zeta-RB
    CG1041-RA
    Et l'autre comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FBtr0087976	128up-RA,CG8340-RA
    FBtr0083565	14-3-3epsilon-RA,CG31196-RA
    FBtr0088412	14-3-3zeta-RB,CG17870-RB
    FBtr0081734	CG1041-RA
    FBtr0110774	CG1041-RB,CG1041-RA
    Je veux rechercher toutes les valeurs de mon fichier 1 dans le fichier 2 de façon à recupérer la valeur qui commence par FBtr.
    Pour cela, j'ai fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while read ligne
    do
    	test=`grep -w $ligne fichier2.txt`;
    	if [ ! -z "$test" ];then
    	echo "$ligne	$test" 
    	fi
     
     
    done < fichier1.txt
    Cela me retourne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    128up-RA	FBtr0087976	128up-RA,CG8340-RA
    14-3-3epsilon-RA	FBtr0083565	14-3-3epsilon-RA,CG31196-RA
    14-3-3zeta-RB	FBtr0088412	14-3-3zeta-RB,CG17870-RB
    CG1041-RA	FBtr0081734	CG1041-RA
    FBtr0110774	CG1041-RB,CG1041-RA # je voudrais CG1041-RA FBtr0110774 CG1041-RB,CG1041-RA
    Le problème, c'est que lorsque mon grep retourne plus d'une ligne, je n'ai pas l'affichage de la valeur $ligne dans la première colonne ...
    Comment puis je faire ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Bonjour,

    il faudrait tester le retour de grep pour savoir s'il y a plus d'une ligne, et alors parcourir cette sortie comme un fichier.

    NB: ! -z = -n.

    pourquoi la sortie doit-elle avoir cette forme ?

    awk me semble plus adapté, pas pour remplacer grep, mais pour remplacer tout le script.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre régulier
    Inscrit en
    Janvier 2010
    Messages
    257
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 257
    Points : 81
    Points
    81
    Par défaut
    J'ai fait comme ceci, je ne sais pas s'il y avait plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while read ligne
    do
    	test="$(grep -w $ligne $1)";
    	if [ -n "$test" ];then
    	echo "$test" | awk -vinput="$ligne" 'BEGIN {FS= "\n"}{print input"\t" $0}' >> $2
    	fi
     
     
    done < $3

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    je voyais plutôt ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'NR==FNR{motifs[$0]++; next}{for(mot in motifs)if($0 ~ mot)print mot"\t"$0}' ceci cela
    EDIT:
    une solution un peu plus bashy :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ while read line; do mapfile -t ar < <(grep -w "$line" cela); ((${#ar[@]})) && printf "$line\t%s\n" "$ar[@]}"; done < <ceci
    ou carrément bashée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ while read line; do while read line2; do [[ $line2 =~ $line ]] && ar+=( "$line2" ); done < cela; ((${#ar[@]})) && printf "$line\t%s\n" "$ar[@]}"; unset ar; done < ceci
    mais bon, niveau performance, y a pas photo : c'est awk !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour,

    j'ai l'impression qu'on remplace un fichier de correspondance par un autre fichier de correspondance. Il faudrait cerner le vrai but final.

    Car, quit à utiliser awk, autant prendre le fichier suivant, en considérant la tabulation et la virgule comme séparateur, ayant ainsi le "FBtr0087976" comme champ $1 et les autres $2 $3 ... $NF :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    FBtr0087976	128up-RA,CG8340-RA
    FBtr0083565	14-3-3epsilon-RA,CG31196-RA
    FBtr0088412	14-3-3zeta-RB,CG17870-RB
    FBtr0081734	CG1041-RA
    FBtr0110774	CG1041-RB,CG1041-RA
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 18/10/2011, 00h06
  2. Réponses: 2
    Dernier message: 07/09/2010, 14h15
  3. Réponses: 6
    Dernier message: 23/07/2007, 21h56
  4. Résultat d'une commande DOS dans une variable
    Par tomix81 dans le forum Général Python
    Réponses: 2
    Dernier message: 18/05/2007, 11h02
  5. Réponses: 22
    Dernier message: 09/12/2005, 21h27

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