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 :

recherche multi critere shell


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut recherche multi critere shell
    je suis sous AIX et je veux afficher les lignes avec 'le mans, marseille et nantes' (il faut impérativement qu'il y est les 3 critères). le grep ne fait que le OU et pas le ET me semble t'il.
    Au final, ma recherche se fera sous un répertoire avec plusieurs centaines de fichiers et je ne veux afficher que lorsque tous les critères ( un dizaine) sont présents.

    exemple de fichier1:
    paris
    bordeaux
    le mans
    lyon
    marseille
    nantes

    exemple de fichier2:
    paris
    bordeaux
    le mans
    lyon
    marseille
    la rochelle
    nice
    bastia

    le résultat de la commande devra être (seul le fichier1 contient les 3 critères)
    fichier1:le mans
    fichier1:marseille
    fichier1:nantes

    Merci d'avance

  2. #2
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    on peut s'en sortir avec grep en jouant du xargs et des options -l, -H et -E de grep, c'est un peu cracra mais ça fait le job :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ grep -l 'le mans' fichier* | xargs grep -l 'marseille' | xargs grep -l 'nantes' | xargs grep -HE "le mans|marseille|nantes"
    fichier1:le mans
    fichier1:marseille
    fichier1:nantes
    si à terme le propos est d'avoir une dizaine de critères... à voir, ça fait une ligne un peu à rallonge mais ça peut convenir (pour peu qu'on soit pas trop pressé non plus éventuellement), sinon envisager de sortir l'artillerie un peu plus lourde avec awk ou perl, en maintenant un champ de bits par exemple

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2014
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Merci
    Ça marche nickel, même avec plusieurs expressions de recherche.
    Je ne connaissais pas le xargs
    j'ai plus qu'à automatiser tout ca et envoi de mail auto.

    Merci beaucoup

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    je me suis amusé à faire ledit script à base de awk, plus long mais qui sera également beaucoups plus rapide avec un grand volume de données à traiter, on a comme prérequis le fichier liste_villes.txt qui contient la liste des villes (1 ville par ligne) :

    (comme d'hab le script est déplié pour gagner en lisibilité mais on peut tout mettre à la suite et le faire tenir sur une seule ligne)

    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
    awk '
    BEGIN {
       while ((getline v < "liste_villes.txt") > 0) {
          ville[v] = 2^i++
       }
    }
     
    {
       for(j in ville){
          if (match($0,j)){
             bitfield[FILENAME] = or(bitfield[FILENAME], ville[j]);
             aff[FILENAME] = sprintf ("%s%s:%s\n", aff[FILENAME], FILENAME, j);
          }
       }
    }
     
    END {
       found = (2^i++) - 1;
       for (v in bitfield) {
          if (bitfield[v] == found) {
             printf ("%s", aff[v]);
          }
       }
    }' fichier*
    le principe est le suivant; on commence par créer notre champ de bits dans la clause BEGIN en attribuant pour chaque ville une puissance de 2
    ensuite pour chaque ligne, si on identifie l'une des ville que l'on recherche on effectue un OU logique avec la fonction or() pour mettre explicitement le "bit" de la ville correspondante à 1, ainsi avec "le mans", "marseille" et "nantes" notre bitfield dans le fichier1 a les bits 1,2 et 3 mis à 1, soit le nombre binaire 111 et qui vaut 7 en décimal, on retrouve cette valeur en prenant la puissance de 2 suivante et en lui retranchant 1 dans la clause END
    on en profite également à chaque correspondance trouvée pour concaténer le résultat avec sprintf de manière à formater l'affichage à la fin
    finalement dans la clause END on ne fait que vérifier pour chaque ville, si le bitfield est rempli, alors on affiche les résultats trouvés dans l'ordre

Discussions similaires

  1. Recherche Multi-criteres dans un formulaire
    Par valery17 dans le forum Access
    Réponses: 6
    Dernier message: 22/05/2006, 16h17
  2. [formulaire] recherche multi criteres
    Par Treuze dans le forum IHM
    Réponses: 3
    Dernier message: 10/01/2006, 10h36
  3. [Collections]Implémenter une recherche multi-critère performante
    Par ppaul127 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 29/12/2005, 14h38
  4. gui pour recherche multi critere
    Par komando dans le forum Interfaces Graphiques en Java
    Réponses: 3
    Dernier message: 02/12/2005, 19h08
  5. Réponses: 14
    Dernier message: 15/06/2005, 13h14

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