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 :

Bug de grep ?


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Par défaut Bug de grep ?
    Bonjour à toutes et à tous

    Je rencontre un petit problème grep. J'ai deux listes de références contenues chacune dans une variable : MNList et ToKeep.

    Voici une partie de MNList
    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
    #80
    #81
    #8
    #82
    #83
    #84
    #85
    #86
    #87
    #88
    #89
    #90
    #91
    #9
    #92
    Et voici une partie de ToKeep :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #5
    #58
    #61
    #64
    #65
    #71
    #83
    #85
    #86
    #88
    #91
    En gros, je veux comparer MNList à ToKeep et générer un fichier qui contient l'information "DEL" pour chaque référence #x de MNList qui ne sera pas retrouvée dans ToKeep.

    Lorsque je boucle sur MNList :
    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
    imax=`echo $MNList | awk '{print NF;}'`
     
    for i in `seq 1 $imax`;
    do
      MN=`echo $MNList | cut -d " " -f $i`
    echo "MN = '$MN'"
    echo "grep : "
    echo $ToKeep | grep -o "$MN"
      if [ -z "`echo $ToKeep | grep -o "$MN"`" ] ; then
    	del="DEL"
    echo "FLAG DEL"
      else
    	del=""
    echo "FLAG ELSE"
      fi
     
      LH=`echo $list | grep -o "@$MN@" | wc -l`
      echo "$MN $LH $del" >> $txtFile
    done
    j'obtiens le problème suivant :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    MN = '#8'
    grep :
    #8
    #8
    #8
    #8
    FLAG ELSE
    MN = '#82'
    grep :
    FLAG DEL
    MN = '#83'
    grep :
    #83
    FLAG ELSE
    MN = '#84'
    grep :
    FLAG DEL
    MN = '#85'
    grep :
    #85
    FLAG ELSE
    MN = '#86'
    grep :
    #86
    FLAG ELSE
    MN = '#87'
    grep :
    FLAG DEL
    MN = '#88'
    grep :
    #88
    FLAG ELSE
    MN = '#89'
    grep :
    FLAG DEL
    MN = '#90'
    grep :
    FLAG DEL
    MN = '#91'
    grep :
    #91
    FLAG ELSE
    MN = '#9'
    grep :
    #9
    FLAG ELSE
    Pourquoi grep renvoi plusieurs fois #8 ? #8 est absent de ToKeep il ne devrait rien renvoyer, de même #9 est renvoyé alors qu'il n'est pas présent dans ToKeep (et cette fois-ci grep ne renvoi qu'une seule occurrence du motif recherché). #83 par exemple est bien reconnu et le bon flag lui est attribué... C'est à n'y rien comprendre ^^"

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 348
    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 348
    Par défaut
    Bonjour,

    Comment dire, MN=#8 et ce motif est bien présent dans les différents #80,#81,#82...

    Donc grep a encore raison

    Un détail: cela me parait bien lourd ton script, j'ai l'impression que selon ton besoin, cela doit tenir en 2 ou 3 lignes et sans des trucs comme cut, grep,...

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Mai 2012
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2012
    Messages : 17
    Par défaut
    Merci pour la réponse !

    Décidément, je n'arrive pas à m'y faire à grep xD

    Et pourquoi #9 n'est renvoyé qu'une fois ?

    Pour le côté lourd du script, c'est bien possible, je n'ai que très peu de connaissances en shell...

    De manière général, comment rechercher un motif sans avoir ce soucis ?

  4. #4
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Citation Envoyé par TheMoustic Voir le message
    Et pourquoi #9 n'est renvoyé qu'une fois ?
    Parce qu'il n'apparaît qu'une fois.
    Le mieux serait que tu expliques mieux ce que tu souhaites faire, ton script est difficile à lire à cause de l'indentation et sa logique semble tirée par les cheveux...

    De manière générale, comment rechercher un motif sans avoir ce soucis ?
    En définissant ce que tu cherches vraiment, et ça ne semble pas être un motif.

    Si tu cherches des lignes contenant exactement une chaine de caractères et rien d'autre, fait un:

    Si tu cherches des "mots":

    ou plus simplement

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Bonjour

    En gros, je veux comparer MNList à ToKeep et générer un fichier qui contient l'information "DEL" pour chaque référence #x de MNList qui ne sera pas retrouvée dans ToKeep.

    Pour t'ouvrir des horizons:

    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
    $ awk '(FNR==NR){a[$0]++;next;} (a[$0]==0){$2="DEL";} 1' ToKeep MNList
    #80 DEL
    #81 DEL
    #8 DEL
    #82 DEL
    #83
    #84 DEL
    #85
    #86
    #87 DEL
    #88
    #89 DEL
    #90 DEL
    #91
    #9 DEL
    #92 DEL

  6. #6
    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
    salut,

    remplace tes -o par --color=always ça va devenir limpide

Discussions similaires

  1. Bug new build ??
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 31/01/2003, 10h30

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