Traitement de texte avec awk ou sed

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. 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 !
    1. Modérateur
      Ok mais j'ai un "command garbled"
      Avec "sed" ?
    2. 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}
    3. Modérateur
      Sur quel système tu es ?
      Quelle version de sed ?
    4. Je suis sur une station de travail Sun avec Solaris 5.10.
    5. Modérateur
      Et la version de sed ?
  2. 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.
    1. Modérateur
      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)
    2. Non je parlais du message de swed.
  3. Modérateur
    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
    $

    ;-))
    1. 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.