Traitement de texte avec awk ou sed

romzzzz -  
 romzzzz -
Bonjour,

Je cherche à récupérer plusieurs valeurs dans des fichiers texte. Ces fichiers ont à peu près tous la même structure qui ressemble à une succession de champs ANOLOG identiques à celui-ci :

=== ANOLOG ========================================= 23/11/2009 08:37:21 =
codano non significatif CODANO=-1
CR=0 CHA=B
CODCOMP=1850
LOC_DETECT : T_PROC=20 - N_PROC=449 - N_DET=5
ENT_DET=2 - SER_FCT=20 ID_FCT=220
REFDET=0
ENT_DIS=0 -

....

===ANOLOG===============

Le but est d'enregistrer dans une variable (pourquoi pas un tableau une ligne) la valeur des champs CODCOMP, T_PROC, N_PROC, N_DET, ENT_DET, SER_FCT, ID_FCT.

J'ai déjà réussi à récupérer ceux de la ligne LOC_DETECT mais seulement après avoir modifié le fichier en faisant des grep / paste et ensuite en utilisant sed. J'aimerai le faire directement avec awk par exemple.

Pour info j'écris un programme en shell script !

Des idées ?

Merci d'avance !

4 réponses

  1. swed
     
    Hello,

    Moi j'aurais fait comme ça, par exemple pour REFDET :

    for REFDETline in 'grep REFDET le_fichier'; do
    monREFDET='echo $REFDETline | awk -F"=" '{print $2}''
    allREFDET='echo $allREFDET $monREFDET'
    done

    Et donc dans $allREFDET, tu obtiens la liste de tous les REFDET du fichier, séparés par un espace...

    Ça te convient ?
    Y'a surement mieux hun...

    Cordialement, M.
    0
  2. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
     
    Salut,

    $ cat plop 
    === ANOLOG ========================================= 23/11/2009 08:37:21 =
    codano non significatif CODANO=-1
    CR=0 CHA=B
    CODCOMP=1850
    LOC_DETECT : T_PROC=20 - N_PROC=449 - N_DET=5
    ENT_DET=2 - SER_FCT=20 ID_FCT=220
    REFDET=0
    ENT_DIS=0 -
    
    ....
    $ sed -n '/CODCOMP/{N;N; s/\n/ /g; s/[^[:digit:] ]//g;s/  */,/gp}' plop
    1850,20,449,5,2,20,220
    $

    ;-))
    0
  3. romzzzz
     
    Merci, cela fonctionne (sauf qu'il faut des back quotes à chaque fois :) ) !

    Mais le but (je n'ai pas été assez précis) c'est de former pour chaque champ ANOLOG du fichier un tableau 1 dimension de ce genre :

    ano1(CODCOMP, T_PROC, N_PROC, N_DET, ENT_DET, SER_FCT, ID_FCT)
    ano2(CODCOMP, T_PROC, N_PROC, N_DET, ENT_DET, SER_FCT, ID_FCT)
    ano3(...

    etc.

    Je vais travailler dans cette voie, merci.
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Il faut des back quotes où ?

      $ sed -n '/CODCOMP/{N;N; s/\n/ /g; s/[^[:digit:] ]//g;s/  */,/g;s/.*/(&)/p}' plop 
      (1850,20,449,5,2,20,220)
      0
    2. romzzzz
       
      Non je parlais du message de swed.
      0
  4. romzzzz
     
    Ok mais j'ai un "command garbled" et je doute que cela marche sur le fichier qui contient environ une centaine de champ ANOLOG !

    En tout cas merci jipicy, ca m'avance déjà pas mal !
    0
    1. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Ok mais j'ai un "command garbled"
      Avec "sed" ?
      0
    2. romzzzz
       
      Oui avec sed :

      ~/Essais>bash -x essai2.sh
      + read -p 'Entrez le nom du fichier de traces : ' nomfichier
      Entrez le nom du fichier de traces : Anologs.doc
      + echo -e 'Lecture des champs du fichier Anologs.doc\n'
      Lecture des champs du fichier Anologs.doc

      + sed -n '/CODCOMP/{N;N; s/\n/ /g; s/[^[:digit:] ]//g;s/ */,/g;s/.*/(&)/p}' Anologs.doc
      sed: command garbled: /CODCOMP/{N;N; s/\n/ /g; s/[^[:digit:] ]//g;s/ */,/g;s/.*/(&)/p}
      0
    3. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Sur quel système tu es ?
      Quelle version de sed ?
      0
    4. romzzzz
       
      Je suis sur une station de travail Sun avec Solaris 5.10.
      0
    5. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      Et la version de sed ?
      0