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

Fermé
bob737 Messages postés 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024 - 17 sept. 2018 à 13:14
 Utilisateur anonyme - 20 sept. 2018 à 16:16
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 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024
17 sept. 2018 à 13:48
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
17 sept. 2018 à 16:28
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 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024
17 sept. 2018 à 17:01
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
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 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024
18 sept. 2018 à 10:16
Pardon... je n'ai pas précisé mais je dois traiter le fichier xml par un shell.
0
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 144 Date d'inscription jeudi 24 septembre 2009 Statut Membre Dernière intervention 14 mars 2024
18 sept. 2018 à 17:13
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
20 sept. 2018 à 16:16
tu pourrais utiliser python dans un shell !
python possède en natif, je crois, une librairie XML, qui permet de faire du XML2CSV.
0