Traiter XML avec awk

Résolu/Fermé
GHISLINO Messages postés 214 Date d'inscription lundi 25 juillet 2011 Statut Membre Dernière intervention 8 décembre 2023 - 5 avril 2017 à 13:42
GHISLINO Messages postés 214 Date d'inscription lundi 25 juillet 2011 Statut Membre Dernière intervention 8 décembre 2023 - 9 avril 2017 à 16:11
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
7 avril 2017 à 11:39
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
6 avril 2017 à 12:28
hello
décris ce qu'il faut extraire
0
GHISLINO Messages postés 214 Date d'inscription lundi 25 juillet 2011 Statut Membre Dernière intervention 8 décembre 2023
6 avril 2017 à 16:32
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 lundi 25 juillet 2011 Statut Membre Dernière intervention 8 décembre 2023
8 avril 2017 à 10:33
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 lundi 25 juillet 2011 Statut Membre Dernière intervention 8 décembre 2023
8 avril 2017 à 12:20
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 18718 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 22 mars 2024 5 615
9 avril 2017 à 11:59
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 lundi 25 juillet 2011 Statut Membre Dernière intervention 8 décembre 2023
9 avril 2017 à 16:11
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