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

Linux Discussion :

Grep? besoin de la colonne d'une seq recherchee


Sujet :

Linux

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Grep? besoin de la colonne d'une seq recherchee
    Bonjour,
    J'ai un fichier de plusieurs lignes, dans lesquelles je recherche une sequence d'erreur. En plus d'avoir le numero de la ligne fourni par grep

    (jusqu'à maintenant je fais:
    grep -nE -i ' 15 40 ' assol_codes.csv >> erreur.out )

    je voudrais avoir le numero de la colonne ou se trouve la sequence recherchee. Faut il rajouter une option, ou rediriger la sortie?

    Merci d'avance!

    marion

  2. #2
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    un solution de fortune serait d'utiliser awk et de récupérer toutes les lignes et de comparer $1 à ta séquence, puis $2 puis $3 etc... Dés que la comparaison est bonne, tu connaîtrais le n° de colonne.

    exemple de code de awk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # récupération des chemins
    DIR_LCH=`gawk 'BEGIN {FS=" "; OFS=" "}$1=="LCH"{print($2)}' < inst.pth`
    DIR_APPLI=`gawk 'BEGIN {FS=" "; OFS=" "}$1=="APPLI"{print($2)}' < inst.pth`
    DIR_BDD=`gawk 'BEGIN {FS=" "; OFS=" "}$1=="BDD"{print($2)}' < inst.pth`
    DIR_SPLR=`gawk 'BEGIN {FS=" "; OFS=" "}$1=="SPLR"{print($2)}' < inst.pth`
    DIR_DSK=`gawk 'BEGIN {FS=" "; OFS=" "}$1=="DSK"{print($2)}' < inst.pth`
    sachant que inst.pth est de forme
    LCH /root/tryinstall
    APPLI /root/tryinstall/appli
    BDD /root/tryinstall/bdd
    SPLR /opt/prologue/bin
    DSK /root/Desktop
    $1 correspond à la 1ère colone $2 à la 2eme etc ...
    tu pourrais faire $1 =="' 15 40 "{print("1") à moins qu'il n'y ait une variable genre $# qui voudrait dire n° de colonne.

    gawk est ton ami -> man gawk
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Mon fichier fait plus de 2000 lignes...
    En fait, je ne connais pas du tout la commande awk. Je viens de regarder le manuel, mais ca me parait assez chaud. Il faut faire un programme ?

    Je ne peux pas faire tout simplement:

    [xterm] gawk -option_donnant_nb_ling -option_donnant_nb_colo 'texte a rechercher' fichier_entree >> sortie

    ?

    J'ai trouve une commande match, mais je ne vois aps vraiment comment m'en servir.
    En plus, il peut y avoir plusieurs erreurs différents sur une meme ligne de mon fichier,et je voudrais qu'il parcourt toutes les lignes, et me releve toutes les lignes ou j'ai au moins une erreur en y rajoutant l'endroit où elles sont (tableau avec match?) , comme avec grep un peu.
    C pas possible?

    Merci pour votre réflexion...

    marion

  4. #4
    Membre expérimenté
    Avatar de nyal
    Profil pro
    Inscrit en
    Septembre 2002
    Messages
    622
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2002
    Messages : 622
    Points : 1 428
    Points
    1 428
    Par défaut
    Bonjour,

    Voici ce que tu peux faire avec awk par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #!/bin/sh                                                                                                                                                       
     
    pattern=$1
    shift
    awk '{ str=$0; value=0; while (pos = match(str, "'$pattern'")) {                                                                                                
    size = RSTART + RLENGTH                                                                                                                                     
    str=substr(str, RSTART + RLENGTH)                                                                                                              
    pos += value
    print FILENAME ":" FNR ":" pos ":" $0                                                                                                           
    value += RSTART + RLENGTH - 1                                                                                                              
    }                                                                                                              
    }' $@
    Et pour l'utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    nyal $ ./grep.sh POST fichier1 fichier2
    fichier1:94:24:                     $champ=array_keys($_POST);
    fichier2:7:7:aff($_POST);  bien(POST); POST
    fichier2:7:20:aff($_POST);  bien(POST); POST
    fichier2:7:27:aff($_POST);  bien(POST); POST
    Voila. Je ne sais pas si ca te convient. Mais tu as un debut

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut probleme au niveau du pattern..Prise en compte des espaces ?
    Merci pour ta réponse, c deja un grand morceau de mon probleme.Je l'ai teste sur un fichier simple:
    JE VAIS A LA POSTE
    POSTSCRIPT

    Et cela marche que je mette POST, 'POST', 'P', P.

    Par contre, dès que j'introduis des expressions regulieres, ou des espaces, il ne suit plus:
    [calcul@PC82 Adaptation]$ ./grep.sh 'A LA' test
    awk: cmd. ligne:1: { str=$0; value=0; while (pos = match(str, "A
    awk: cmd. ligne:1: ^ chaîne non complétée

    [calcul@PC82 Adaptation]$./grep.sh 'A*' test
    =>il affiche infiniment ma premiere ligne

    Or les erreurs recherchees dans mon fichier seront de la forme ' 15 37 ''.
    Comment faire prendre en compte les espaces?
    Pour chercher les 15 suivis d'un espace,puis 2 chiffres: 15 ??, mais pour 15 suivi d'un espace puis de 2 chiffres sauf 1 puis 5, comment faire?

    J'ai regarde un peu sur internet, et vais continuer,mais si vous avez la solution...

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut deja un peu mieux...
    Votre programme m'a bien aidé, mais j'ai encore quelques problemes:

    #!/bin/sh

    # appel a la fonction: ./grep.sh a nom_fichier le a pouvant etre remplace par n'importe quoi, cpour remplir...

    pattern=$1
    shift
    awk '{ str=$0; value=0; while (pos = match(str,/\<[^252][^0-9]253\>/)) {
    size = RSTART + RLENGTH
    str=substr(str, RSTART + RLENGTH)
    pos += value
    print FNR ":" pos ":" $0
    value += RSTART + RLENGTH - 1
    }
    }' $@

    mais quand je le lance sur un fichier test, il ne me reconnait pas les 253 253 qui sont aussi une erreur...

    [calcul@PC82 Adaptation]$ ./rech_test.sh a test_luz
    2:1:3 253 253 6 253 253
    2:11:3 253 253 6 253 253
    6:4:10 6 253
    8:1:8 253 253
    Ici par exemple il ne tient pas compte du 252 suivi de 253, or 253 /= 253, non?

    Si vous avez une idee d'ou ca vient, merci de me le dire!

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2004
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Voici ce que j'ai fait:

    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
    48
      if test $# -ne 4       # si le nombre de parametres n'est pas 3
        then                    # affiche l'usage
          echo 'Usage: ./rech.sh dr_annee nb_colonne fich_out fich_in'
          echo 'Ce programme cherche les sequences d erreur dans le fichier'
         echo 'Il renvoie un fichier avec la ligne, la colonne et l annee ou la sequence est erronee'
        exit 1
      fi
     
     
      dr_annee=$1
      nb_colonne=$2
      fich_out=$3
     
      shift
      shift
      shift
      awk '{ nb_colonne='$nb_colonne';  dr_annee='$dr_annee'; str=$0; value=0; while (pos = match(str,/(\<(25|251|252|253|254)[ ]251\>)|(\<(10|11|15|20|253|252|254|25|26|27|30|31|32|33|34|35|36|37|38|40|41|42|44|45|46|47|50|51|61|62|63|64|70|71|72|73|74|75|81|82|83|90|91|999)[ ]252\>)|(\<(10|11|15|20|251|253|25|254|26|27|30|31|32|33|34|35|36|37|38|40|41|42|44|45|46|47|50|51|61|62|63|64|70|71|72|73|74|75|81|82|83|90|91|999)[ ]253\>)|(\<(10|11|15|20|251|252|254|25|26|27|30|31|32|33|34|35|36|37|38|40|41|42|44|45|46|47|50|51|61|62|63|64|70|71|72|73|74|75|81|82|83|90|91|999)[ ]254\>)|(\<(10|11|37|20)[ ]37\>)|(\<(10|15|25|251|252|253|254|26|27|30|31|32|33|34|35|36|38|40|41|42|44|45|46|47|50|51|61|62|63|64|70|71|72|73|74|75|81|82|83|90|91)[]20\>)|(\<(15|251|252|253|254|25|26|27|30|31|32|33|34|35|36|37|38|40|41|42|44|45|46|47|50|51|61|62|63|64|70|71|72|73|74|75|81|82|83|90|91)[ ]10\>)/)){
     
        size = RSTART + RLENGTH  
     
        R1=RSTART
        L1=RLENGTH
     
        str_temp=substr(str,RSTART)
        pos_temp=match(str_temp,/\<[0-9][0-9]*\>/)
        R2=RSTART
        L2=RLENGTH
     
        str=substr(str, R1 + L2)
        pos += value
     
        annee=dr_annee+1
        i=length($0)
        j=nb_colonne
     
        while(i>pos){
          i += -length($j)-1
          annee=annee-1
          j=j-1
        }
     
        print  FNR " : "  pos " : " annee " : " $O
        value += R1 + L2 -1       
      }                
      }' $@ > $fich_out
     
      echo Taille: ;
      wc -l $fich_out;
    Cela m'affiche la ligne, la colonne, et surtout l'annee (si l'on precise avant le nombre de colonnes et la derniere annee) ou se trouve l'erreur. Par contre, j'ai encore un probleme avec les regexp. Comment ecrire :
    \<(tout ce qui n'est aps 251)[ ] (tout ce qui n'est aps 252)[ ] (tout ce qui n'est aps 253)[ ](zero ou plusieurs [ ]254)\>'?
    tout en ne captant pas deux fois la meme erreur ( par exemple, '251 253 252 254 254 254' ne donne qu'une erreur a la premiere colonne)

    Merci d'avance pour votre aide, j'ai un peu tout essayé, et je ne vois plus trop quoi faire.

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

Discussions similaires

  1. [Toutes versions] Besoin d'un code pour vérifier l'existence d'une chaine à partir d'une colonne dans une autre
    Par Chedy Smida dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 20/02/2015, 17h05
  2. Réponses: 6
    Dernier message: 13/01/2015, 16h42
  3. Instruction SQL qui supprime une colonne d'une table
    Par tseg dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/10/2003, 20h47
  4. Changements de colonnes dans une BDD MySQL
    Par arnaud_verlaine dans le forum Requêtes
    Réponses: 8
    Dernier message: 07/08/2003, 11h33
  5. Ajout d'une colonne dans une table ...
    Par Djedjeridoo dans le forum SQL
    Réponses: 2
    Dernier message: 22/07/2003, 16h12

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