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. 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.
    1. 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. 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.
      2. 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 ?