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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    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.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  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
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 651
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 651
    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
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    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 .

+ 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