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 :

Récupération ligne spécifique bash


Sujet :

Shell et commandes GNU

  1. #1
    Membre actif
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : iut informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Par défaut Récupération ligne spécifique bash
    Bonsoir,

    que je vous explique mon problème. J'ai un fichier.txt qui me sert de bdd avec une structure du type:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Nomfichier1.txt empreintemd5 chemind'acces
    vide occurencedumot ligneouilapparait
    avion occurencedumot ligneouilapparait
    pouli occurencedumot ligneouilapparait
    Nomfichier2.txt empreintemd5 chemind'acces
    avion occurencedumot ligneouilapparait
    marque occurencedumot ligneouilapparait
    Nomfichier3.txt empreintemd5 chemind'acces
    manger occurencedumot ligneouilapparait
    pour occurencedumot ligneouilapparait
    car occurencedumot ligneouilapparait
    Comme on peut le voir cette bdd est composée d'un fichier ou plusieurs et y affiche les mots le composant (il y a un seul mot par ligne dans les fichier.txt). Pour chaque mot elle marque aussi le nombre fois qu'il apparaît dans le fichier et les lignes où il apparaît. Cette bdd est créée avant avec un autre script qui fait l'arborescence d'un répertoire, récupère chaque fichier et met tout dans la bdd. J'arrive donc à mon deuxième script

    Lorsque que je lance mon script je mets en paramètre un mot que je souhaite rechercher.
    Je dois afficher le nomfichier, l'adresse du fichier, le mot, son nombre d'occurrence, les lignes où il apparaît.
    On aurait donc si je tape ./projet.bash avion le résultat suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Nomfichier1.txt  chemind'acces
    avion 1fois ligne2
    Nomfichier2.txt  chemind'acces
    avion 2fois ligne4ligne6
    Je dois me servir uniquement de la bdd. Elle est créée justement avant pour faire ça.
    Et à vrai dire je n'ai aucune idée de comment faire. Je vois comment récupérer les lignes où il y a le mot avion (grep "\.txt"$ bdd.txt), récupérer le paramètre et le mettre dans une variable(motrecherche=$2), récupérer les lignes où il y a le mot (grep $motrecherche bdd.txt). Mais en faisant ça j'ai un affichage de tous les fichiers txt de la base de donnée et de tous les mots avion(comme dans l'exemple). Merci de votre aide

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    c'est un besoin fréquemment exposé : celui de la machine à remonter le temps.
    mais une telle machine n'existe pas.
    alors, il faut enregistrer les données pertinentes et les afficher quand les circonstances le requièrent.

    donc, il faut mettre les données concernant le fichier dans une variable en attendant que le mot cherché soit rencontré, alors on affiche les données demandées.
    il faut aussi prendre soin d'effacer les données qui n'auront pas été utilisées.

    cf. Comment lire une fichier en shell.

  3. #3
    Membre actif
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : iut informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Par défaut
    Si j'ai bien compris je stock la premiere ligne fichiern1.txt md5 adressefichier dans une variable. Puis je parcours les lignes avec une boucle. Je fais un if (premier motrencontré = motrecherché) alors affiché variable puis affiché ligne. et je fais un deuxieme if (premier motrencontré = "".txt) alors variable change en prenant valeur ligne actuel testé?

  4. #4
    Invité
    Invité(e)
    Par défaut
    on parcourt le fichier,
    si une ligne comporte le motif correspondant au nom de fichier... alors on stocke,
    si une ligne comporte le motif recherché, alors on affiche, et, facultativement, on efface les données qui ne sont plus utiles (elles seront de toute façon écrasées au prochain nom de fichier...)
    fin du parcourt

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

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

    À ta place, j'utiliserais "awk".
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ awk -vmot=avion '/\.txt/{fic=$1;next;} ($0 ~ "\\<"mot"\\>"){print fic,mot,$0;}' bdd.txt
    Nomfichier1.txt avion avion occurencedumot ligneouilapparait
    Nomfichier2.txt avion avion occurencedumot ligneouilapparait
    Et deuxièmement, fais bien attention au "motif" !
    Car "avion" est compris dans "hydravion".
    Il faut ajouter un début-de-mot \< et fin-de-mot \> comme je l'ai fait.

  6. #6
    Membre actif
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : iut informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Par défaut
    quand je recupere la ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -vmot=avion '/\.txt/{fic=$1;next;} ($0 ~ "\\<"mot"\\>"){print fic,mot,$0;}' bdd.txt
    rien ne se passe. Il ne trouve rien. pourtant j'ai bien avion dans ma bdd. De plus je ne comprends pas très bien awk. Tu pourrais me detailler ce que la commande fais .

  7. #7
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Flodelarab
    À ta place, j'utiliserais "awk".
    moi, j'utiliserais sed :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/acces$/{s/\([^ ]*\) [^ ]* \(.*\)/\1 \2/;h};/^avion\>/{H;g;x;p}' /tmp/bdd.txt
    mais avant de courir, il faut apprendre à marsher.

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

    @cimestro tu as codé quelque chose de ton coté ? on peut voir ?

    une troisième façon de faire :
    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
    #!/bin/bash
     
    myword="$1"
    fichier="bdd.txt"
     
    while read line; do
       firstword="${line%% *}"
       if [[ "$firstword" =~ \.txt$ ]]; then
          lastword="${line##* }"                 # /!\ on part du principe qu'il n'y a pas d'espaces
          headline="$firstword $lastword"        # ni dans les noms de fichiers ni dans les chemins /!\
       fi
       if [[ "$firstword" =~ ^$myword$ ]]; then
          echo "$headline / $line"
       fi
    done < "$fichier"

  9. #9
    Membre actif
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : iut informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Par défaut
    que ce soit avec awk ou avec sed les deux commandes n'affiche rien. Pourtant j'ai recopier mot pour mot vos commande mais rien n'y fais. Rien resort

  10. #10
    Membre actif
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : iut informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Par défaut
    bufferbob ton programme marche si les lignes sont composé uniquement du mot en question. Le probleme c que sur chaque ligne il y a mot occurrence n°ligne. Et la je recupere la ligne que si il y a seulement mot.

  11. #11
    Invité
    Invité(e)
    Par défaut
    la "bdd" a été créée sur GNU/Linux ?

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 308
    Par défaut
    Nos premières réponses sont des exemples et une incitation à lire la documentation idoine.

    Si cela ne fonctionne pas, c'est que la structure de ton fichier n'est pas exactement comme tu l'as écrite.

    Pour la commande awk:
    • Si la ligne contient ".txt", il récupère le nom de fichier dans la variable "fic".
    • sinon, s'il voit le mot, il affiche fic le mot et la ligne trouvée.


    Fin de ligne en \r\n dans ton bdd.txt ?

  13. #13
    Membre actif
    Homme Profil pro
    iut informatique
    Inscrit en
    Novembre 2018
    Messages
    34
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : iut informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 34
    Par défaut
    j'ai finalement trouvé en recherchant et en m'inspirant de vos réponse voici mon code final:

    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
    while read line
    do
    firstword=`echo $line | cut -f 1 -d ' '`
    lastword="${line## }"
    affichagetitre=`echo $line | cut -f 1 -d ' '`
    affichageaddresse=`echo $line | cut -f 3 -d ' '`
    headline="$firstword $lastword"
    fi
    if [["$firstword" =~ ^$myword$ ]]
    then
    echo "nomfichier:"$affichagetitre "adressefichier:"$affichageadresse
    affichagemot=`echo $line | cut -f 1 -d ' '`
    affichageoccu=`echo $line | cut -f 2 -d ' '`
    affichageligne=`echo $line | cut -f3- -d ' '`
    echo "mot: "$afficahgemot " occurence:" $affichageoccu "ligne:" $affichageligne
    fi
    done < "$fichier"

  14. #14
    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
    • ligne 8 il y a un fi qui se balade tout seul
    • ligne 9 il manque un espace entre [[ et "$firstword"
    • le script ne fonctionne pas avec l'exemple de fichier que tu as fourni plus haut
    • firstword, affichagetitre et affichagemot, pourquoi 3 variables qui contiennent la même chose ?
    • tu peux éviter la forêt de cut en tournant le code différemment :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      line="un deux trois"
      read first second third <<< "$line"
      echo "mot 1 = $first"
      echo "mot 2 = $second"
      echo "mot 3 = $third"
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      mot 1 = un
      mot 2 = deux
      mot 3 = trois

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 29/10/2010, 15h10
  2. Réponses: 13
    Dernier message: 26/06/2006, 12h10
  3. [SQL] Récupérer plusieurs lignes spécifiques d'une table
    Par Anduriel dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 29/04/2006, 19h49
  4. Supprimer qques lignes spécifiques d'un fichier
    Par Krispy dans le forum Langage
    Réponses: 3
    Dernier message: 09/04/2006, 13h52
  5. [Forms6i] Focus sur ligne spécifique
    Par lafouine dans le forum Forms
    Réponses: 4
    Dernier message: 30/08/2005, 11h12

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