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

A voir également:

6 réponses

dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
hello
décris ce qu'il faut extraire
0
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
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

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
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
dubcek Messages postés 18789 Date d'inscription   Statut Contributeur Dernière intervention   5 637
 
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
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