Supprimer chaîne de caractères entre <> et...

bob737 Messages postés 157 Statut Membre -  
 Utilisateur anonyme -
Bonjour,

J'ai deux fichiers fichiers qui contiennent les éléments suivants

Fichier toto

<bucket_billing_info>
<name>paxq1<name>
<vpool_id>urn:storageos:ReplicationGroupInfo:eea19191-5584-4c65-958b-cc6826f7c588:global<vpool_id>
<total_size>2730.2338<total_size>
<total_size_unit>GB<total_size_unit>
<total_objects>103981727<total_objects>
<total_mpu_size>0<total_mpu_size>
<total_mpu_parts>0<total_mpu_parts>
<TagSet>
<bucket_billing_info>


et

Fichier titi

<bucket_billing_info>
<name>paxq3<name>
<vpool_id>urn:storageos:ReplicationGroupInfo:eea19191-5584-4c65-958b-cc6826f7c588:global<vpool_id>
<total_size>0<total_size>
<total_size_unit>GB<total_size_unit>
<total_objects>3<total_objects>
<total_mpu_size>0<total_mpu_size>
<total_mpu_parts>0<total_mpu_parts>
<TagSet>
<bucket_billing_info>

1)Je souhaite garder uniquement les valeurs et donc supprimer tous les éléments <blabla>
2) Puis pour chaque paragraphe, mettre toutes les valeurs sur une ligne.

ici même, on m'avait aidé et donné la solution suivante qui fonctionne pour toto:

awk -F "[<>]" '$3 "" {if(n++)printf ";"; printf $3} /bucket_billi/ {print ""; n=0} ' toto | awk NF

=> paxq1;urn:storageos:ReplicationGroupInfo:eea19191-5584-4c65-958b-cc6826f7c588:global;2730.2338;GB;103981727

mais qui ne fonctionne pas pour le fichier titi car les lignes contenants "0" ne sont pas pris en compte, les champs n'apparaissent pas sur le résultat final

=> paxq3;urn:storageos:ReplicationGroupInfo:eea19191-5584-4c65-958b-cc6826f7c588:global;GB;3

Pourquoi? avez-vous une solution?

Merci de votre aide.





A voir également:

5 réponses

bob737 Messages postés 157 Statut Membre
 
Finalement, j'ai trourvé. :-)

awk -F "[<>]" 'BEGIN {n=0} {if(n++)printf ";"; printf "%s", $3} /bucket_billi/ {print ""; n=0} ' titi

=> paxq3;urn:storageos:ReplicationGroupInfo:eea19191-5584-4c65-958b-cc6826f7c588:global;0;GB;3;0;0;;
0
Utilisateur anonyme
 
salut,

tu es sûr du format de ces fichiers ?
c'est toi qui les génères, ou d'où viennent-ils ?

ce n'est pas du XML correct : il n'y a pas de fermeture d'étiquette :
<tag>value</tag>

--------------------------^
0
bob737 Messages postés 157 Statut Membre
 
Le bon format est
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<namespace_billing_info>
<namespace>paxq</namespace>
<total_size>18038.8706</total_size>
<total_size_unit>GB</total_size_unit>
<total_objects>190526136</total_objects>
<total_mpu_size>0</total_mpu_size>
<total_mpu_parts>0</total_mpu_parts>
<sample_time>2018-09-17T14:48:23Z</sample_time>
<bucket_billing_info>
<name>paxq2</name>
<vpool_id>urn:storageos:ReplicationGroupInfo:eea19191-5584-4c65-958b-cc6826f7c588:global</vpool_id>
<total_size>362.8567</total_size>
<total_size_unit>GB</total_size_unit>
<total_objects>11357245</total_objects>
<total_mpu_size>0</total_mpu_size>
<total_mpu_parts>0</total_mpu_parts>
<TagSet/>
</bucket_billing_info>
<bucket_billing_info>
<name>paxq3</name>
<vpool_id>urn:storageos:ReplicationGroupInfo:eea19191-5584-4c65-958b-cc6826f7c588:global</vpool_id>
<total_size>0</total_size>
<total_size_unit>GB</total_size_unit>
<total_objects>3</total_objects>
<total_mpu_size>0</total_mpu_size>
<total_mpu_parts>0</total_mpu_parts>
<TagSet/>
</bucket_billing_info>
<bucket_billing_info>
<name>paxq0</name>
<vpool_id>urn:storageos:ReplicationGroupInfo:eea19191-5584-4c65-958b-cc6826f7c588:global</vpool_id>
<total_size>14943.2213</total_size>
<total_size_unit>GB</total_size_unit>
<total_objects>75111814</total_objects>
<total_mpu_size>0</total_mpu_size>
<total_mpu_parts>0</total_mpu_parts>
<TagSet/>
</bucket_billing_info>
<bucket_billing_info>
<name>paxq1</name>
<vpool_id>urn:storageos:ReplicationGroupInfo:eea19191-5584-4c65-958b-cc6826f7c588:global</vpool_id>
<total_size>2732.7926</total_size>
<total_size_unit>GB</total_size_unit>
<total_objects>104057074</total_objects>
<total_mpu_size>0</total_mpu_size>
<total_mpu_parts>0</total_mpu_parts>
<TagSet/>
</bucket_billing_info>
<next_marker/>
<uptodate_till>2018-09-08T08:05:00.000</uptodate_till>
</namespace_billing_info>


et je veux obtenir:
paxq;18038.8928;GB;190526459;2018-09-17T14:50:07Z
paxq2;urn:storageos:ReplicationGroupInfo:eea19191-5584-4c65-958b-cc6826f7c588:global;362.8632;GB;11357300
paxq3;urn:storageos:ReplicationGroupInfo:eea19191-5584-4c65-958b-cc6826f7c588:global;0;GB;3
paxq0;urn:storageos:ReplicationGroupInfo:eea19191-5584-4c65-958b-cc6826f7c588:global;14943.2213;GB;75111814
paxq1;urn:storageos:ReplicationGroupInfo:eea19191-5584-4c65-958b-cc6826f7c588:global;2732.8083;GB;104057342

:-) J'y arrive mais je dois bidouiller pas mal... C'est assez moche et pas franchement dynamique.
Les valeurs de <total_mpu_size> et <total_mpu_parts> ne m'intéresse pas.

sinon, ça marche avec
cat fichier | awk -F "[<>]" '$3 "" {if(n++)printf ";"; printf $3} /bucket_billi/ {print ""; n=0} ' toto | awk NF mais si une valeur = 0, elle n’apparaît pas.

Merci
0
Utilisateur anonyme
 
je pratique très peu XSLT et uniquement pour moi, donc j'ai fait un collage de ce que j'ai trouvé sur internet, et ce n'est probablement pas la meilleure manière de faire :
<?xml version="1.0"?>                                                                                                                                                                                                                                                     
<xsl:stylesheet version="1.0"                                                                                                                                                                                                                                             
        xmlns:xsl="http://www.w3.org/1999/XSL/Transform">                                                                                                                                                                                                                 
        <xsl:output method="text" encoding="utf-8"/>                                                                                                                                                                                                                      
                                                                                                                                                                                                                                                                          
        <xsl:template match="/namespace_billing_info">                                                                                                                                                                                                                    
        <xsl:for-each select=".">                                                                                                                                                                                                                                         
                <xsl:value-of select="*[text() != '' and not(self::total_mpu_size) and not(self::total_mpu_parts)]"/><xsl:text>;</xsl:text>                                                                                                                               
        </xsl:for-each>                                                                                                                                                                                                                                                   
                <xsl:for-each select="bucket_billing_info">                                                                                                                                                                                                               
                        <xsl:for-each select="*[text() != '' and not(self::total_mpu_size) and not(self::total_mpu_parts)]">                                                                                                                                              
                                <xsl:value-of select="."/><xsl:text>;</xsl:text>                                                                                                                                                                                          
                        </xsl:for-each><xsl:text>                                                                                                                                                                                                                         
</xsl:text>                                                                                                                                                                                                                                                               
                </xsl:for-each>                                                                                                                                                                                                                                           
        </xsl:template>                                                                                                                                                                                                                                                   
                                                                                                                                                                                                                                                                          
</xsl:stylesheet>
ce qui produit :
paxq;paxq2;urn:storageos:ReplicationGroupInfo:eea19191-5584-4c65-958b-cc6826f7c588:global;362.8567;GB;11357245;                                                                                                                                                          
paxq3;urn:storageos:ReplicationGroupInfo:eea19191-5584-4c65-958b-cc6826f7c588:global;0;GB;3;
paxq0;urn:storageos:ReplicationGroupInfo:eea19191-5584-4c65-958b-cc6826f7c588:global;14943.2213;GB;75111814;
paxq1;urn:storageos:ReplicationGroupInfo:eea19191-5584-4c65-958b-cc6826f7c588:global;2732.7926;GB;104057074;

à utiliser avec Xalan, xsltproc, xmllint...
0
bob737 Messages postés 157 Statut Membre
 
Pardon... je n'ai pas précisé mais je dois traiter le fichier xml par un shell.
0
Utilisateur anonyme
 
c'est débile.
le XML, ça se traite avec XSLT.

et, pour info,
awk
c'est pas du shell, c'est du
awk
!
tu pourrais aussi bien utiliser
perl
, ou
python
, en ligne de commande, ce ne serait pas davantage du shell.
0

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

Posez votre question
bob737 Messages postés 157 Statut Membre
 
Dans une production, on a rarement le choix de la manière dont on interprète les données.
et oui, j'utilise un awk dans un shell.
Bref..
0
Utilisateur anonyme
 
tu pourrais utiliser python dans un shell !
python possède en natif, je crois, une librairie XML, qui permet de faire du XML2CSV.
0