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 pour un seul nombre


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
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 82
    Par défaut Grep pour un seul nombre
    Bonjour,

    Ma question est toute simple, j'arrive même pas à comprendre comment je passe à côté alors que j'ai lu (grossièrement j'avoue) et regarder pas mal de tuto sur grep.

    Je suis sur que je le savais avant mais ça n'arrive pas à revenir ...

    Bref !

    J'ai un fichier assez grand (300 Mo de lignes ...)

    Je n'aimerais prendre que les lignes (avec le numéro de ligne et la ligne du dessus) contenant le pattern 31 mais rien d'autre.

    J'ai beaucoup de 310,311 etc ...

    Donc si je fais que grep -n1 31 Dky.check on me sort beaucoup plus de ligne que prévu ...

    Merci d'avance !

  2. #2
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 357
    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 357
    Par défaut
    Bonjour,
    le pattern est '[^0-9]31[^0-9]'

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 82
    Par défaut
    Ok parfait merci beaucoup !

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 357
    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 357
    Par défaut
    En fait, le pattern est incomplet, il ne tient pas compte des cas où le 31 est en début ou fin de ligne...

    il y a peut-être plus simple, mais le pattern suivant est plus juste: '[^0-9]31[^0-9]\|^31[^0-9]\|[^0-9]31$\|^31$'

  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
    Salut,

    grep -n -B1 '\b31\b' fich devrait le faire aussi, non ?

  6. #6
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 357
    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 357
    Par défaut
    C'est selon comment on comprend le besoin de départ...
    car pour quelque chose du genre 31A ça ne fonctionne pas.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par Gagzkul Voir le message
    Je n'aimerais prendre que les lignes (avec le numéro de ligne et la ligne du dessus) contenant le pattern 31 mais rien d'autre.

    J'ai beaucoup de 310,311 etc ...

    Donc si je fais que grep -n1 31 Dky.check on me sort beaucoup plus de ligne que prévu ...
    Bref, pour résumer les interrogations (bien légitimes):

    Qu'est-ce que tu appelles "contenant le pattern 31 mais rien d'autre" ?

    Veux-tu seulement les lignes contenant uniquement les 2 caractères "31" et aucun caractère ni avant ni après sur la ligne?
    Veux-tu éviter tous les "31" directement précédés ou suivis d'un chiffre (qui représentent un autre nombre que le nombre 31)?
    Veux-tu éviter une ligne contenant "31.5"?
    Veux-tu éviter une ligne contenant "31A"?
    Veux-tu accepter une ligne contenant "031" (qui peut être vu comme représentant le nombre 31)?

    Peux-tu donner une liste d'exemples "contenant le pattern 31 mais rien d'autre" et une liste de contre-exemples "ne contenant pas le pattern 31 mais rien d'autre" ?

  8. #8
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 82
    Par défaut
    Il me semblait pourtant avoir repondu,

    Et bien ce que je voulais dire est que le pattern est 31,

    Tout autre terme style 31A ; 310 ; 31, ; 31. ; 31* ; 31@ ; 13 ; 031 ; 3131, JE NE LES VEUX PAS (j'ai mis en majuscule pour que l'on voit la fin de ma phrase)

    Bref je ne souhaite rechercher seulement le pattern 31 et rien d'autre (que ce soit avant ou apres).
    Mes nombres etaient tous entier j'aurais du le preciser, je n'ai pas voulu etre avare en information c'etait juste que pour moi 31 et rien d'autre c'etait assez clair et concis ...

    Merci pour toute les reponses !

  9. #9
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 357
    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 357
    Par défaut
    Bah, j'ai toujours pas compris, mais c'est peut-être parce que je n'arrive pas à voir d’intérêt de rechercher une ligne qui contient uniquement 31.

    Et si tu nous expliquais la finalité de cette recherche (en faisant des phrases complètes) ?

  10. #10
    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 Gagzkul Voir le message
    Il me semblait pourtant avoir repondu,

    Et bien ce que je voulais dire est que le pattern est 31
    non !

    Tout autre terme style 31A ; 310 ; 31, ; 31. ; 31* ; 31@ ; 13 ; 031 ; 3131
    Les phrases pas terminées, ça n'aide pas ...

    Bref je ne souhaite rechercher seulement le pattern 31 et rien d'autre (que ce soit avant ou apres).
    Ok, mais plutôt que parler de pattern, tu aurais mieux fait de dire dès le début que les lignes doivent contenir 31 et rien d'autre. Ton pattern, ce n'est pas 31 mais comme déjà indiqué dans ma réponse ^31$

  11. #11
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 82
    Par défaut
    Euh , nah j'ai du supprimer la fin de ma phrase sans m'en rendre compte ....
    Bref, exactement j'avais une liste de nombre :

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    120 54567 21567 1 234 
    12 2 31 78  4 6
    123 87 8 213 
    3 84  321 310
    31 15 78  3 1
    Par exemple ... Sauf que c'etait un fichier qui faisait un nombre de ligne affolant (plusieurs millions) et qui faisait plusieurs Go (oui precedemment c'etait 300 Mo mais cela s'etait agrandit plus tard ..) alors que ce n'etait qu'un fichier remplit de nombre.

    Et je souhaitais trouver les lignes ou il n'y avait que le nombre 31. Donc je me suis mal exprime (encore une fois vraiment desole ....) mais je ne cherchais que le nombre 31 avec la ligne correspondante mais ce que je voulais dire rien avant et rien apres cela voulait dire pas de X31Y juste 31 (je ne sais pas trop si je me suis fait comprendre ...)

    Lorsque je voulais faire le grep -n1 31, j'obtenais un nombre un peu moins impressionnant de lignes (500 Mo) mais encore trop impressionnant pour pouvoir trouver ce nombre 31.
    Mais bien sur j'obtenais plein de nombre du style 310 etc etc ....

    Car c'etait une particule qui possedait une identification de 31 qui apparaissait dans ma desintegration alors qu'elle n'existait pas dans ma base de donnee et cela faisait plante tout le programme.
    Finalement l'erreur etait du a une mauvaise version et j'ai pu corriger tout cela autrement mais j'avoue que ca m'avait fait perdre un peu de temps ..

    J'espere que j'ai ete un peu plus clair, j'essaye pourtant de m'ameliorer a chaque message mais je suis pas vraiment doue pour ca on dirait ... (puis le clavier qwerty ne doit pas aider ..)

    Donc pour repondre au questions precedentes :

    Veux-tu seulement les lignes contenant uniquement les 2 caractères "31" et aucun caractère ni avant ni après sur la ligne? NON
    Veux-tu éviter tous les "31" directement précédés ou suivis d'un chiffre (qui représentent un autre nombre que le nombre 31)? OUI
    Veux-tu éviter une ligne contenant "31.5"? OUI
    Veux-tu éviter une ligne contenant "31A"? OUI
    Veux-tu accepter une ligne contenant "031" (qui peut être vu comme représentant le nombre 31)? NON mais de toute facon je n'en avais pas dans mon fichier

  12. #12
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 357
    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 357
    Par défaut
    Donc, le pattern du grep semblerait être: '^31$\|^31\s\+\|\s\+31$\|\s\+31\s\+'

  13. #13
    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 Gagzkul Voir le message
    Euh , nah j'ai du supprimer la fin de ma phrase sans m'en rendre compte ....
    Il n'est pas interdit et même plutôt recommandé de se relire après un post, et il est possible de le corriger après coup à l'aide du bouton "Modifier le message"

    Et je souhaitais trouver les lignes ou il n'y avait que le nombre 31. Donc je me suis mal exprime (encore une fois vraiment desole ....) mais je ne cherchais que le nombre 31 avec la ligne correspondante mais ce que je voulais dire rien avant et rien apres cela voulait dire pas de X31Y juste 31 (je ne sais pas trop si je me suis fait comprendre ...)
    Non, tu ne t'exprimes toujours pas correctement, tu ne souhaites pas les lignes où il n'y a que le nombre 31 car ça exclurait aussi les lignes où il y a aussi autre chose. Ce que tu veux, ce sont les lignes où le nombre 31 apparaît de manière isolée, c'est à dire sans être accolé à d'autres caractères (hors espace).

    Cela dit, vu que ton fichier ne contient que des lignes contenant des nombres séparés par des espaces, tu n'as pas vraiment besoin d'expression régulière et tu peux utiliser :

    mais il faudrait que tu confirmes que c'est bien ce que tu veux dire avec "Je n'aimerais prendre que les lignes (avec le numéro de ligne et la ligne du dessus)"...

  14. #14
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 103
    Par défaut
    Citation Envoyé par Gagzkul Voir le message
    Bref, exactement j'avais une liste de nombre :

    Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    120 54567 21567 1 234 
    12 2 31 78  4 6
    123 87 8 213 
    3 84  321 310
    31 15 78  3 1
    D'après l'exemple que tu donnes, il semble que ton fichier contienne des lignes où n'apparaissent que les chiffres de 0 à 9 et le caractère "espace" (utilisé comme séparateur entre des nombres).

    Du coup, je me rends compte que j'ai oublié une question essentielle:

    Veux-tu un "31", à la fois {soit en début de ligne soit précédé d'une espace} et également {soit en fin de ligne soit suivi d'une espace}?

    Auquel cas les solutions données par les spécialistes fonctionnent :-)


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

Discussions similaires

  1. fonction pour compter le nombre de checkbox coché ?
    Par Death83 dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 15/09/2005, 11h28
  2. [C#] Plusieurs LinkButton pour une seule fonction
    Par FunnyDjo dans le forum ASP.NET
    Réponses: 3
    Dernier message: 08/06/2005, 22h01
  3. Grep pour filtrer le fichier log
    Par devdev2003 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 23/02/2005, 05h48
  4. Algorithme pour trier trois nombres
    Par legosam dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 17/01/2005, 21h47
  5. Réponses: 13
    Dernier message: 20/07/2004, 08h54

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