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. 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
    1. hello
      décris ce qu'il faut extraire
      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.
        0
        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.
          0
          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
            0
            1. 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
              0
              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
                0