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 :

Grep - ne matcher qu'une partie d'une séquence donnée sur un fichier


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 64
    Par défaut Grep - ne matcher qu'une partie d'une séquence donnée sur un fichier
    Hello,

    Un exemple sera plus simple.

    Soit la liste suivante :

    123456654353545
    435432222222222
    333333435411111
    354399999999999

    Sur le fichier contenant ceci :

    3535 -> toto
    3543 -> tata
    4354 -> titi
    3543 -> tutu

    Ce qui m'intéresse est en gras, mais, cette séquence (toujours de 4 chars) est incluse dans une plus grosse séquence (elle aussi de taille unique à chaque fois). Je ne peux pas prévoir à l'avance où sera située la séquence en gras qui m'intéresse dans la chaîne complète..

    Par exemple, je veux matcher 123456654353545 et me renvoyer 1 si j'ai au moins la séquence 3535 trouvée dans mon fichier.

    Mais je ne vois pas comment le faire avec grep, sachant que je ne dois donner QUE la séquence qui m'intéresse.

    Auriez vous une idée ? Merci !

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    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
    # cd /tmp
    # mkdir toto
    # cd toto
    # echo 1234 > toto
    # echo 2345 > titi
    # echo 3456 > tata
    # cat > tutu
    zzzzzz
    zzzzzz1234zzzzz1234
    zzzzzzzzz
    zzzzz3456
    # for i in titi toto tata ; do                                                                   
    > grep -i $(cat $i) tutu > /dev/null                                                             
    > if [ $? == 0 ] ; then echo contenu de $i present ; retour=1 ; echo $retour ; else echo contenu de $i non present ; retour=0 ; echo $retour ; fi
    > done
    contenu de titi non present
    0
    contenu de toto present
    1
    contenu de tata present
    1
    # cd ..
    # rm -rf toto                                                                                    
    #
    en se basant sur une liste de valeurs au lieu du contenu de fichiers référents ce sera la même chose...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # for i in 2345 1234 3456  ; do                                                                    
    > grep -i $(cat $i) tutu > /dev/null                                                             
    > if [ $? == 0 ] ; then echo contenu de $i present ; retour=1 ; echo $retour ; else echo contenu de $i non present ; retour=0 ; echo $retour ; fi
    > done
    contenu de titi non present
    0
    contenu de toto present
    1
    contenu de tata present
    1
    a toi d'adapter à ton besoin

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Je ne sais pas si j'ai tout bien compris à ta demande, mais voilà ce que j'ai en considérant les 2 fichiers "f" et "f1" suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ cat f
    123456654353545
    435432222222222
    333333435411111
    354399999999999
     
    $ cat f1
    3535 -> toto
    3543 -> tata
    4354 -> titi
    3543 -> tutu
    2223 -> tete
    Et la syntaxe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ while read line;do grep -q "${line%% *}" f && echo "1 pour ${line##* }" || echo "0 pour ${line##* }";done < f1 
    1 pour toto
    1 pour tata
    1 pour titi
    1 pour tutu
    0 pour tete

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 64
    Par défaut
    Merci à vous deux, mais ce n'est exactement ça.

    Je vais plutôt vous expliquer mon problème plutôt qu'un exemple non explicite :

    J'ai un fichier plat suivant, qui me sert de base de référence :

    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
     
    cat reference
     
    UES410 000190104953 TM4
    UES41A 000A9A70A598 3MA4
    UES413 000190105703 TM4
    UES414 000A9A70A540 3MA4
    UES415 000A9A703173 3MA4
    UES417 000A9A70A990 3MA4
    UES491 000A94901107 3MA4
    UES4A3 0001901057AA TM4
    UES4A4 000A9A70A14A 3MA4
    UES4A5 000A9A70A57A 3MA4
    UES4A7 000A9A70A997 3MA4
    UES4A7 000A95700179 3MA4
    GYS4A1 000A90105779 TM4
    GYS4A3 000190105717 TM4
    GYS4A4 000190105714 TM4
    GYS4A5 000A9A70A079 3MA4
    GYS4A7 000A9A70A447 3MA4
    GYS4A7 000A9A70A544 3MA4
    GYS4A8 000A9A70A547 3MA4
    GYS433 000A95700170 3MA4
    GYS43A 000A9A703178 3MA4
    UESIS01 78018T81F5C8 S3C
    UESIS0A 78018F8A7078 S3C
    UESIS03 7801810A71T8 S3C
    UESIS1A 780180855A88 S3C
    GYSIS0A 78018E8A7F50 S3C
    GYSIS1A 780181055TE8 S3C
    GYSIS04 78018E0A7EC8 S3C
    GYSIS03 78018E8A1A58 S3C
    GYSIS14 780181059778 S3C
    UESIS04 78018E0AA750 S3C
    UESIS14 780180859AF0 S3C
    GYSIS01 78018E8A9U30 S3C
    G3SIS0A 780180855TA8 S3C
    GRSIS0A 780181054UT8 S3C
    UESIS99 780A8500ACE0 S3C
    UESC309 070170191037 3N45400
    MUSC301 07017085A039 3N45400
    MUSC30A 070170F14039 3N45400
    S4SC301 070170AC0037 3N45400
    S4SC30A 0701701T4037 3N45400
    TASC310 070170AA1037 3N45400
    TASC3A0 0701707UF135 3N45400
    première colonne, le switch, 2eme colonne, l'identifiant du type de mon disque, 3eme colonne le modèle.

    Je vais donc recevoir une liste de nom complet de disque, soit, cette liste :

    254342432478018E8A7F50324324
    324324070170AC003732432432
    32432432432424000A9A70A598423432
    etc..

    Je cherche à retrouver le switch et le modèle en fonction de l'identifiant du type de mon disque contenu dans le nom complet de chaque disque présent dans le fichier liste.
    On note que l'identifiant du type de mon disque est à un emplacement différent à chaque fois, pour chaque modèle différent, dans le nom complet des disques. Du coup, je ne peux pas prédire où cette séquence sortira dans ma chaine.

    Du coup, je voudrais faire une sorte de grep partiel : en gros, pour chaque séquence complète (pour chaque ligne quoi), voir si au moins une partie de la séquence match quelque-chose dans mon fichier de référence.

    J'espère être plus clair, j'ai du mal de poser le problème correctement :-\

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    En adaptant ma commande précédente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ while read line;do grep -q "${line}" liste && grep "${line}" référence ;done < <(awk '{print $2}' référence)
    UES41A 000A9A70A598 3MA4
    GYSIS0A 78018E8A7F50 S3C
    S4SC301 070170AC0037 3N45400

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

    j'ai mis +1 pour la réponse de Zipe31 car je vais utiliser la même méthode.

    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
    $ cat reference 
    UES410 000190104953 TM4
    UES41A 000A9A70A598 3MA4
    UES413 000190105703 TM4
    UES414 000A9A70A540 3MA4
    UES415 000A9A703173 3MA4
    UES417 000A9A70A990 3MA4
    UES491 000A94901107 3MA4
    UES4A3 0001901057AA TM4
    UES4A4 000A9A70A14A 3MA4
    UES4A5 000A9A70A57A 3MA4
    UES4A7 000A9A70A997 3MA4
    UES4A7 000A95700179 3MA4
    GYS4A1 000A90105779 TM4
    GYS4A3 000190105717 TM4
    GYS4A4 000190105714 TM4
    GYS4A5 000A9A70A079 3MA4
    GYS4A7 000A9A70A447 3MA4
    GYS4A7 000A9A70A544 3MA4
    GYS4A8 000A9A70A547 3MA4
    GYS433 000A95700170 3MA4
    GYS43A 000A9A703178 3MA4
    UESIS01 78018T81F5C8 S3C
    UESIS0A 78018F8A7078 S3C
    UESIS03 7801810A71T8 S3C
    UESIS1A 780180855A88 S3C
    GYSIS0A 78018E8A7F50 S3C
    GYSIS1A 780181055TE8 S3C
    GYSIS04 78018E0A7EC8 S3C
    GYSIS03 78018E8A1A58 S3C
    GYSIS14 780181059778 S3C
    UESIS04 78018E0AA750 S3C
    UESIS14 780180859AF0 S3C
    GYSIS01 78018E8A9U30 S3C
    G3SIS0A 780180855TA8 S3C
    GRSIS0A 780181054UT8 S3C
    UESIS99 780A8500ACE0 S3C
    UESC309 070170191037 3N45400
    MUSC301 07017085A039 3N45400
    MUSC30A 070170F14039 3N45400
    S4SC301 070170AC0037 3N45400
    S4SC30A 0701701T4037 3N45400
    TASC310 070170AA1037 3N45400
    TASC3A0 0701707UF135 3N45400
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat liste
    254342432478018E8A7F50324324
    324324070170AC003732432432
    32432432432424000A9A70A598423432
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cut -d' ' -f2 reference | grep -f - liste
    254342432478018E8A7F50324324
    324324070170AC003732432432
    32432432432424000A9A70A598423432
    La couleur est celle de ma console (issue du grep)

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

Discussions similaires

  1. donner une couleur a une partie d'une forme
    Par ralf91 dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/04/2008, 17h02
  2. Réponses: 1
    Dernier message: 04/04/2008, 12h14
  3. Sélectionner seulement une partie d'une valeur d'une cellule
    Par ArthurO0O dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 20/08/2007, 11h05
  4. masquer une partie d'une vidéo par une banniere
    Par lezabour dans le forum Général Conception Web
    Réponses: 1
    Dernier message: 16/10/2006, 16h47
  5. copier une partie d'une image vers une autre
    Par gregcat dans le forum Langage
    Réponses: 1
    Dernier message: 14/04/2006, 13h39

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