Traiter XML avec awk

Résolu
Bonjour ,

Je veux traiter un fichier xml en récupérant juste les infos spécifiques: ci-dessous le fichiers.

Fichier brut

<managedObject class="HW" version="HW1.0" distName="PLMN-PLMN/RNC-302/WBTS-2262/HW-1" id="1548162">
      <p name="NEType">WBTS</p>
      <p name="locationName">Cogefar</p>
      <p name="operationalState">enabled</p>
      <p name="systemTitle">Nokia Flexi WCDMA Base Station</p>
      <p name="vendorName">Nokia Siemens Networks</p>
    </managedObject>
    <managedObject class="MODULE" version="HW1.0" distName="PLMN-PLMN/RNC-302/WBTS-2262/HW-1/MODULE-173" id="1548177">
      <p name="identificationCode">472181A</p>
      <p name="state">working</p>
      <p name="subrackSpecificType">472181A-173</p>
      <p name="userLabel">FSMF</p>
      <p name="vendorName">Nokia Siemens Networks</p>
    </managedObject>
    <managedObject class="MODULE" version="HW1.0" distName="PLMN-PLMN/RNC-302/WBTS-2262/HW-1/MODULE-19" id="1548175">
      <p name="identificationCode">472182A</p>
      <p name="serialNumber">K9164589860</p>
      <p name="state">working</p>
      <p name="subrackSpecificType">472182A-19</p>
      <p name="userLabel">FBBA</p>
      <p name="vendorName">Nokia Siemens Networks</p>
      <p name="version">103</p>
    </managedObject>
    <managedObject class="MODULE" version="HW1.0" distName="PLMN-PLMN/RNC-302/WBTS-2262/HW-1/MODULE-20" id="1548176">
      <p name="identificationCode">472182A</p>
      <p name="serialNumber">F7164734988</p>
      <p name="state">working</p>
      <p name="subrackSpecificType">472182A-20</p>
      <p name="userLabel">FBBA</p>
      <p name="vendorName">Nokia Siemens Networks</p>
      <p name="version">103</p>
    </managedObject>
    <managedObject class="MODULE" version="HW1.0" distName="PLMN-PLMN/RNC-302/WBTS-2262/HW-1/MODULE-40192" id="1548174">
      <p name="identificationCode">472956A</p>
      <p name="serialNumber">K9162904080</p>
      <p name="state">working</p>
      <p name="subrackSpecificType">472956A-40192</p>
      <p name="userLabel">FRGU</p>
      <p name="vendorName">Nokia Siemens Networks</p>
      <p name="version">101</p>
    </managedObject>
<managedObject class="HW" version="HW1.0" distName="PLMN-PLMN/RNC-302/WBTS-2269/HW-1" id="1547974">
      <p name="NEType">WBTS</p>
      <p name="locationName">Kotto-Eglise-EPC</p>
      <p name="operationalState">enabled</p>
      <p name="systemTitle">Nokia Flexi WCDMA Base Station</p>
      <p name="vendorName">Nokia Siemens Networks</p>
    </managedObject>
    <managedObject class="MODULE" version="HW1.0" distName="PLMN-PLMN/RNC-302/WBTS-2269/HW-1/MODULE-173" id="1547975">
      <p name="identificationCode">472181A</p>
      <p name="state">working</p>
      <p name="subrackSpecificType">472181A-173</p>
      <p name="userLabel">FSMF</p>
      <p name="vendorName">Nokia Siemens Networks</p>
    </managedObject>
    <managedObject class="MODULE" version="HW1.0" distName="PLMN-PLMN/RNC-302/WBTS-2269/HW-1/MODULE-19" id="1547977">
      <p name="identificationCode">472182A</p>
      <p name="serialNumber">K9164589908</p>
      <p name="state">working</p>
      <p name="subrackSpecificType">472182A-19</p>
      <p name="userLabel">FBBA</p>
      <p name="vendorName">Nokia Siemens Networks</p>
      <p name="version">103</p>
    </managedObject>
    <managedObject class="MODULE" version="HW1.0" distName="PLMN-PLMN/RNC-302/WBTS-2269/HW-1/MODULE-40192" id="1547979">
      <p name="identificationCode">472854A</p>
      <p name="serialNumber">K9164118730</p>
      <p name="state">working</p>
      <p name="subrackSpecificType">472854A-40192</p>
      <p name="userLabel">FRGY</p>
      <p name="vendorName">Nokia Siemens Networks</p>
      <p name="version">101</p>
    </managedObject>
    <managedObject class="MODULE" version="HW1.0" distName="PLMN-PLMN/RNC-302/WBTS-2269/HW-1/MODULE-40448" id="1547978">
      <p name="identificationCode">472854A</p>
      <p name="serialNumber">K9164118753</p>
      <p name="state">working</p>
      <p name="subrackSpecificType">472854A-40448</p>
      <p name="userLabel">FRGY</p>
      <p name="vendorName">Nokia Siemens Networks</p>
      <p name="version">101</p>
    </managedObject>
    <managedObject class="MODULE" version="HW1.0" distName="PLMN-PLMN/RNC-302/WBTS-2269/HW-1/MODULE-40704" id="1547976">
      <p name="identificationCode">472854A</p>
      <p name="serialNumber">K9164118777</p>
      <p name="state">working</p>
      <p name="subrackSpecificType">472854A-40704</p>
      <p name="userLabel">FRGY</p>
      <p name="vendorName">Nokia Siemens Networks</p>
      <p name="version">101</p>
    </managedObject>
  </cmData>
</raml>



je veux le fichier ci-dessous en sortie

Site;            MODULE      ;FSMF;FBBA;FRGY;FRGU
Kotto-Eglise-EPC;WBTS-2269   ;1   ;1   ;3   ;0
Cogefar;         WBTS-2262   ;1   ;2   ;0   ;1



Merci d'avance

6 réponses

  1. Contributeur
    essayer
    $ cat f2.awk
    func f1() {t["FSMF"]=t["FBBA"]=t["FRGY"]=t["FRGU"]=0}
    func f2(p1, p2, p3, p4, p5, p6) {printf "%-20s;%-10s;%-4s;%-4s;%-4s;%-4s\n", p1, p2, p3, p4, p5, p6}
    BEGIN {f1(); f2("Site", "MODULE", "FSMF", "FBBA", "FRGY", "FRGU")}
    /cmData|<managedObject class="HW"/ && n {f2( n, a[3], t["FSMF"], t["FBBA"], t["FRGY"], t["FRGU"]); f1()}
    /<managedO.*HW/ {split($0, a, "/")}
    /location/ {n=$3}
    /userLab/ {t[$3]++}
    $ awk -F "[<>]" -f f2.awk fichier.xml
    Site ;MODULE ;FSMF;FBBA;FRGY;FRGU
    Cogefar ;WBTS-2262 ;1 ;2 ;0 ;1
    Kotto-Eglise-EPC ;WBTS-2269 ;1 ;1 ;3 ;0
    $
    1. hello Dubcek ,

      il faut extraire les données suivantes:

      WBTS-2262 de la ligne <managedObject class="HW" version="HW1.0" distName="PLMN-PLMN/RNC-302/WBTS-2262/HW-1" id="1548162">

      Cogefar de cette ligne <p name="locationName">Cogefar</p>

      FSMF de cette ligne <p name="userLabel">FSMF</p>

      FBBA de cette ligne <p name="userLabel">FBBA</p>

      FRGU de cette ligne <p name="userLabel">FRGU</p>

      donc pour le nom Cogefar on aura le tableau ci-dessous avec le décompte des module

      Site;            MODULE      ;FSMF;FBBA;FRGY;FRGU
      Cogefar;         WBTS-2262   ;1   ;2   ;0   ;1
      


      Merci d'avance.
      1. Bonjour Dubcek

        Merci pour ton feedback le script marche parfaitement ,

        Mais s'il te plait peut-tu m'expliquer le contenu du script f2.awk

        Cdlt.
        1. surtout cette ligne

          func f2(p1, p2, p3, p4, p5, p6) {printf "%-20s;%-10s;%-4s;%-4s;%-4s;%-4s\n", p1, p2, p3, p4, p5, p6}


          je suppose que P1 P2 P3 P4 P5 P6 représente les champs

          Site; MODULE ;FSMF;FBBA;FRGY;FRGU

          que représente la ligne
          printf "%-20s;%-10s;%-4s;%-4s;%-4s;%-4s\n", 

          Merci d'avance pour ton retour
          1. Contributeur
            func f1() {t["FSMF"]=t["FBBA"]=t["FRGY"]=t["FRGU"]=0}
            func f2(p1, p2, p3, p4, p5, p6) {printf "%-20s;%-10s;%-4s;%-4s;%-4s;%-4s\n", p1, p2, p3, p4, p5, p6}

            on crée 2 fonctions, pour du code appelé plusieurs fois
            f1 initialise à 0 les éléments du tableau associatif t
            f2 imprime bien alignés les 6 paramètres (p1-6) passés à la fonction
            %-20s : 20 car. alignés à gauche, %-10s 10 car. alignés à gauche, etc.
            BEGIN {f1(); f2("Site", "MODULE", "FSMF", "FBBA", "FRGY", "FRGU")}
            on inialise t et on affiche les en-têtes des colonnes
            /cmData|<managedObject class="HW"/ && n {f2( n, a[3], t["FSMF"], t["FBBA"], t["FRGY"], t["FRGU"]); f1()}
            à chaque début de bloc sauf le premier (&& n) ou en fin de fichier (cmData) on affiche les résultats par f2 et on réinitialise t par f1
            /<managedO.*HW/ {split($0, a, "/")}
            on stocke dans le tableau a les éléments de l'en-tête de bloc séparés par / (a[3]=WBTS...)
            /location/ {n=$3}
            on recupère le nom
            /userLab/ {t[$3]++}
            on compte dans le tableau t les lignes contenant FSMF, FBBA, FRGY, FRGU
            1. Bonjour Dubcek,

              Merci infiniment pour ton feedback, ton explication m'a permi de tout pigier et adapter le code sur plusieurs fichiers XML.

              Thanks