Traitement de données de XML en Bash

Résolu
jeljed Messages postés 1 Statut Membre -  
zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,

j'ai plusieurs fichies xml qui ressemblent à ça:

<track id="TR14.2" mainDir="down">
<trackTopology>
<trackBegin id="TRB14.2" pos="0" absPos="40595">
<macroscopicNode ocpRef="PTCAR885"/>
</trackBegin>
<trackEnd id="TRE14.2" pos="4795" absPos="35800">
<macroscopicNode ocpRef="PTCAR1092"/>
</trackEnd>
</trackTopology>
<trackElements>
<speedChanges>
<speedChange id="S14.2" pos="0" absPos="40595" dir="up" vMax="140"/>
</speedChanges>
<gradientChanges>
<gradientChange id="G14.2.6397" pos="4607" absPos="35988" dir="down" slope="2.2"/>
<gradientChange id="G14.2.6398" pos="3988" absPos="36607" dir="down" slope="2.5"/>
<gradientChange id="G14.2.6399" pos="3588" absPos="37007" dir="down" slope="1.9"/>
<gradientChange id="G14.2.6400" pos="2908" absPos="37687" dir="down" slope="1.7"/>
<gradientChange id="G14.2.6401" pos="1871" absPos="38724" dir="down" slope="0"/>
</gradientChanges>
<radiusChanges>
<radiusChange id="R14.2.6454" pos="4475" absPos="36120" dir="down" radius="2273"/>
<radiusChange id="R14.2.6455" pos="4335" absPos="36260" dir="down" radius="0"/>
<radiusChange id="R14.2.6456" pos="4193" absPos="36402" dir="down" radius="2020"/>
<radiusChange id="R14.2.6457" pos="4193" absPos="36402" dir="down" radius="1961"/>
<radiusChange id="R14.2.6458" pos="4063" absPos="36532" dir="down" radius="5900"/>
<radiusChange id="R14.2.6459" pos="4063" absPos="36532" dir="down" radius="6500"/>
<radiusChange id="R14.2.6460" pos="3918" absPos="36677" dir="down" radius="4762"/>
<radiusChange id="R14.2.6461" pos="3728" absPos="36867" dir="down" radius="3635"/>
<radiusChange id="R14.2.6462" pos="3426" absPos="37169" dir="down" radius="0"/>
</radiusChanges>
<levelCrossings/>
<electrificationChanges>
<electrificationChange id="E14.2" pos="0" absPos="40595" dir="up" type="overhead" voltage="3000"/>
</electrificationChanges>
</trackElements>



Je travail sous Ubuntu et je voudrais ressortir les données de gradient et de radius dans un fichier txt sous la forme:

Gradient:
Pos Slope
Pos Slope

Radius:
Pos Radius
Pos Radius

Quelqu'un aurait il une idée...Je suis débutant dans le domaine...

Merci :)

1 réponse

  1. zipe31 Messages postés 34620 Date d'inscription   Statut Contributeur Dernière intervention   6 501
     
    Salut,

    $ cat plop 
    
    <track id="TR14.2" mainDir="down">
    <trackTopology>                   
    <trackBegin id="TRB14.2" pos="0" absPos="40595">
    <macroscopicNode ocpRef="PTCAR885"/>            
    </trackBegin>                                   
    <trackEnd id="TRE14.2" pos="4795" absPos="35800">
    <macroscopicNode ocpRef="PTCAR1092"/>            
    </trackEnd>                                      
    </trackTopology>                                 
    <trackElements>                                  
    <speedChanges>                                   
    <speedChange id="S14.2" pos="0" absPos="40595" dir="up" vMax="140"/>
    </speedChanges>                                                     
    <gradientChanges>                                                   
    <gradientChange id="G14.2.6397" pos="4607" absPos="35988" dir="down" slope="2.2"/>
    <gradientChange id="G14.2.6398" pos="3988" absPos="36607" dir="down" slope="2.5"/>
    <gradientChange id="G14.2.6399" pos="3588" absPos="37007" dir="down" slope="1.9"/>
    <gradientChange id="G14.2.6400" pos="2908" absPos="37687" dir="down" slope="1.7"/>
    <gradientChange id="G14.2.6401" pos="1871" absPos="38724" dir="down" slope="0"/>  
    </gradientChanges>                                                                
    <radiusChanges>                                                                   
    <radiusChange id="R14.2.6454" pos="4475" absPos="36120" dir="down" radius="2273"/>
    <radiusChange id="R14.2.6455" pos="4335" absPos="36260" dir="down" radius="0"/>   
    <radiusChange id="R14.2.6456" pos="4193" absPos="36402" dir="down" radius="2020"/>
    <radiusChange id="R14.2.6457" pos="4193" absPos="36402" dir="down" radius="1961"/>
    <radiusChange id="R14.2.6458" pos="4063" absPos="36532" dir="down" radius="5900"/>
    <radiusChange id="R14.2.6459" pos="4063" absPos="36532" dir="down" radius="6500"/>
    <radiusChange id="R14.2.6460" pos="3918" absPos="36677" dir="down" radius="4762"/>
    <radiusChange id="R14.2.6461" pos="3728" absPos="36867" dir="down" radius="3635"/>
    <radiusChange id="R14.2.6462" pos="3426" absPos="37169" dir="down" radius="0"/>   
    </radiusChanges>                                                                  
    <levelCrossings/>                                                                 
    <electrificationChanges>                                                          
    <electrificationChange id="E14.2" pos="0" absPos="40595" dir="up" type="overhead" voltage="3000"/>
    </electrificationChanges>                                                                         
    </trackElements>                                                                                  
    
    $ awk  'BEGIN {
    FS="\""                           
    }                                 
    {                                 
    if (/gradientChange id/)          
    {                                 
    POS[$4]=$10                       
    }                                 
    if (/radiusChange id/)            
    {                                 
    RAD[$4]=$10                       
    }
    }
    END {
    print "Gradient:"
    for (i in POS) print i" "POS[i]
    printf "\nRadius:\n"
    for (j in RAD) print j" "RAD[j]
    }
    ' plop > fich.txt
    
    $ cat fich.txt
    Gradient:
    3988 2.5
    2908 1.7
    4607 2.2
    3588 1.9
    1871 0
    
    Radius:
    4475 2273
    4063 6500
    4335 0
    3426 0
    3918 4762
    3728 3635
    4193 1961
    $

    ;-))
    0