Traiter XML avec awk

Résolu
GHISLINO Messages postés 214 Date d'inscription   Statut Membre Dernière intervention   -  
GHISLINO Messages postés 214 Date d'inscription   Statut Membre Dernière intervention   -
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. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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
  2. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    hello
    décris ce qu'il faut extraire
    0
  3. GHISLINO Messages postés 214 Date d'inscription   Statut Membre Dernière intervention  
     
    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
  4. GHISLINO Messages postés 214 Date d'inscription   Statut Membre Dernière intervention  
     
    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
  5. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  6. GHISLINO Messages postés 214 Date d'inscription   Statut Membre Dernière intervention  
     
    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
  7. dubcek Messages postés 18627 Date d'inscription   Statut Contributeur Dernière intervention   5 660
     
    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. GHISLINO Messages postés 214 Date d'inscription   Statut Membre Dernière intervention  
       
      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