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ésultat d'un GREP dans une variable


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 8
    Par défaut Résultat d'un GREP dans une variable
    Bonjour,


    Je cherche à réaliser un motif de recherche à partir du nom d'un 1er fichier et d'un ID récupéré dans un fichier texte.
    Le nom du 1er fichier est : Zone1_10_02_2010_Test.tif
    Le fichier texte contient des noms de zones avec des ID correspondants, il est structuré selon la nomenclature suivante : Zone1 196

    Ce motif me servira par la suite à rechercher un 2e fichier dans un autre repertoire. (Partie absente du code source ci-dessous)


    Voici mon code source :

    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
     
     
    #! /bin/bash 
     
     
    for file in *.tif 
    do
     
    	Longueur_NomFichier=$(echo `expr length $file`)
    	echo "Longeur nom : "$Longueur_NomFichier
     
    		#Extraction ID
    	((Fin_NomZone=$Longueur_NomFichier-20))
    	NomZone=$(echo $file | cut -c1-$Fin_NomZone)
    	echo "Nom de la zone : "$NomZone
    	ID=$( grep -i "$NomZone" ID.txt | awk '{print $2}') # Extrait la ligne du fichier texte contenant motif : $NomZone, puis la 2e colonne
    	echo "ID : " $ID
     
    		#Extraction de la date 
    	((Longueur_NomZone=$Longueur_NomFichier-18))
    	((Fin_date=$Longueur_NomZone+9))
    	Date=$(echo $file | cut -c$Longueur_NomZone-$Fin_date)
    	echo "Date "$Date
    	Mois=$(echo $Date | cut -c1-2)
    	echo "Mois "$Mois
    	J=$(echo $Date | cut -c4-5)
    	echo "Jour "$J
    	Annee=$(echo $Date | cut -c7-10)
    	echo "Annee "$Annee
     
    		# Creation du motif
    	Motif_Recherche1="_"$ID"_"$Annee"-"$Mois"-"$J 
    	Motif_Recherche2="_"$Annee"-"$Mois"-"$J"_"$ID 
    	echo "Motif 1 = "$Motif_Recherche1	
    	echo "Motif 2 = "$Motif_Recherche2
     
    done
    La console m'affiche les résultats suivants :


    Longeur nom : 25
    Nom de la zone : Zone1
    ID : 196
    Date 10_02_2010
    Mois 10
    Jour 02
    Annee 2010
    _2010-10-02196
    Motif 2 = _2010-10-02_196

    Le motif 2 est affiché correctement contrairement au motif 1. Le motif 2 est un test pour montrer que l'affichage est fait correctement, j'ai besoin uniquement du motif 1 que je ne parviens pas à créer. Je ne comprends pas d'ou vient ce problème.
    Pouvez vous si possible me donner un coup de main.

    Merci d'avance pour votre aide.


    Azgard

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

    Peux-tu activer le debug sur ton script et fournir la sortie stp?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bash -x <nom_de_ton_script>

  3. #3
    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

    Je t'invite à méditer cette console, et surtout la dernière commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ ls *_*.txt
    moyenne_mobile2.txt  moyenne_mobile.txt  wifi_result.txt
    $ cat corres.txt 
    moyenne 234
    wifi 13
     
    $ awk 'NR==FNR{corres[$1]=$2;next;} {split($0,elts,"_"); print corres[elts[1]];}' corres.txt <(find . -name "*_*.txt" -printf "%f\n")
    234
    234
    13
    $

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Bonjour,

    quelques remarques :
    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
    #! /bin/bash 
     
     
    for file in *.tif # ça, c'est bien.
    do
     
       Longueur_NomFichier=$(echo `expr length $file`) # `echo' inutile, `expr' est une commande externe inutile : le shell peut retourner la longueur d'une chaîne.
       echo "Longeur nom : "$Longueur_NomFichier
     
       #Extraction ID
       ((Fin_NomZone=$Longueur_NomFichier-20))
       NomZone=$(echo $file | cut -c1-$Fin_NomZone) # `cut' inutile, bash sait faire ça tout seul
       echo "Nom de la zone : "$NomZone
       ID=$( grep -i "$NomZone" ID.txt | awk '{print $2}') # mouais, `awk' peut aussi faire des recherches insensibles à la casse
       echo "ID : " $ID
     
       #Extraction de la date 
       ((Longueur_NomZone=$Longueur_NomFichier-18))
       ((Fin_date=$Longueur_NomZone+9))
       Date=$(echo $file | cut -c$Longueur_NomZone-$Fin_date) # voir ma précédente remarque à propos de `cut'
       echo "Date "$Date
       Mois=$(echo $Date | cut -c1-2) # voir ma précédente remarque à propos de `cut'
       echo "Mois "$Mois
       J=$(echo $Date | cut -c4-5) # voir ma précédente remarque à propos de `cut'
       echo "Jour "$J
       Annee=$(echo $Date | cut -c7-10) # voir ma précédente remarque à propos de `cut'
       echo "Annee "$Annee
     
       # Creation du motif
       Motif_Recherche1="_"$ID"_"$Annee"-"$Mois"-"$J # ça ne sert à rien d'extraire les variables d'une chaîne => "_${ID}_$Annee-$Mois-$J", par contre il faut les distinguer des caractères normaux, en les mettant entre accolades.
       Motif_Recherche2="_"$Annee"-"$Mois"-"$J"_"$ID # idem
       echo "Motif 1 = "$Motif_Recherche1  
       echo "Motif 2 = "$Motif_Recherche2
     
    done
    donne quelques exemples de nom de fichiers à traiter, ainsi que le résultat correspondant souhaité,
    et un extrait du fichier ID.txt

    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ f="Zone1_10_02_2010_Test.tif"
    $ echo "${f%%_*}"
    Zone1
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    Par défaut
    Bonjour,

    Pour compléter les propos de N_BaH, un petit exemple (qui pourrait raccourcir un petit peu ton script ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ fichier=Zone1_10_02_2010_Test.tif
    $ read Zone Jour Mois Annee dechet <<<${fichier//_/ }
    $ echo "Zone:$Zone Jour:$Jour Mois:$Mois Annee:$Annee dechet:$dechet"
    Zone:Zone1 Jour:10 Mois:02 Annee:2010 dechet:Test.tif

  6. #6
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2013
    Messages : 8
    Par défaut
    Merci pour vos remarques pour raccourcir mon code.
    En restant dans un premier temps sur l'utilisation du grep, j'aimerais savoir si vous avez une idée de la cause de cette difficulté d'affichage.
    Je pense que ça a un lien avec le retour charriot du grep (_196\r) mais dans ce cas pourquoi l'affichage s'effectue correctement pour le motif 2 ?

    Le motif de recherche (motif 1) que je désire avoir est le suivant : 196_2010-10-02

    Voici le debug de mon script :

    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
    47
     
     
    + for file in '*.tif'
    +++ expr length Zone1_10_02_2010_Test.tif
    ++ echo 25
    + Longueur_NomFichier=25
    + echo 'Longeur nom : 25'
    Longeur nom : 25
    + (( Fin_NomZone=25-20 ))
    ++ cut -c1-5
    ++ echo Zone1_10_02_2010_Test.tif
    + NomZone=Zone1
    + echo 'Nom de la zone : Zone1'
    Nom de la zone : Zone1
    ++ awk '{print $2}'
    ++ grep -i Zone1 ID.txt
    + ID=$'196\r'
    + echo 'ID : ' $'196\r'
    ID :  196
    + (( Longueur_NomZone=25-18 ))
    + (( Fin_date=7+9 ))
    ++ cut -c7-16
    ++ echo Zone1_10_02_2010_Test.tif
    + Date=10_02_2010
    + echo 'Date 10_02_2010'
    Date 10_02_2010
    ++ cut -c1-2
    ++ echo 10_02_2010
    + Mois=10
    + echo 'Mois 10'
    Mois 10
    ++ cut -c4-5
    ++ echo 10_02_2010
    + J=02
    + echo 'Jour 02'
    Jour 02
    ++ cut -c7-10
    ++ echo 10_02_2010
    + Annee=2010
    + echo 'Annee 2010'
    Annee 2010
    + Motif_Recherche1=$'_196\r_2010-10-02'
    + Motif_Recherche2=$'_2010-10-02_196\r'
    _2010-10-02'f 1 = _196
    _2010-10-02196
    ' echo 'Motif 2 = _2010-10-02_196
    Motif 2 = _2010-10-02_196

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    s'il y a un \r, c'est que tu traites un fichier au format DOS, il faut le convertir au format UNIX.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. Réponses: 11
    Dernier message: 18/07/2006, 13h53
  2. récupérer le résultat d'un SELECT dans une variable ?
    Par budhax dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 06/06/2006, 10h24
  3. Mettre le résultat d'un javascript dans une variable php??
    Par kahya dans le forum Général JavaScript
    Réponses: 19
    Dernier message: 19/05/2006, 09h43
  4. Réponses: 4
    Dernier message: 14/09/2005, 17h23
  5. [Sybase] résultat d'un select dans une variable
    Par stoz dans le forum Sybase
    Réponses: 2
    Dernier message: 14/09/2004, 14h28

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