Calculer un pourcentage script shell sed,awk.

[Résolu/Fermé]
Signaler
Messages postés
607
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
15 octobre 2021
-
Messages postés
607
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
15 octobre 2021
-
Bonjour,

voila j'ai mon script shell qui ressemble a cela:

touch ${TMPDIR}/stat_${DATE}.lst

if [ -f "${TMPDIR}/nb_push_${DATE}.lst" ]

then

NBPUSH=`cat ${TMPDIR}/nb_push_${DATE}.lst`
NBPUSHOLD=`cat ${TMPDIR}/nb_push_old.lst`

NBNEWSLETTER=`cat ${TMPDIR}/nb_newsletter_${DATE}.lst`
NBNEWSLETTEROLD=`cat ${TMPDIR}/nb_newsletter_old.lst`

mv -f ${TMPDIR}/nb_newsletter_${DATE}.lst ${TMPDIR}/nb_newsletter_old.lst

fi

if [ -f "${TMPDIR}/nb_cdc_${DATE}.lst" ]

then

NBCDC=`cat ${TMPDIR}/nb_cdc_${DATE}.lst`
NBCDCOLD=`cat ${TMPDIR}/nb_cdc_old.lst`

mv -f ${TMPDIR}/nb_cdc_${DATE}.lst ${TMPDIR}/nb_cdc_old.lst

fi

if [ -f "${TMPDIR}/nb_${DATE}.lst" ]

then

cat ${TMPDIR}/nb_${DATE}.lst | sed -e 's%|%%g;s%[^[:digit:]]%%g' >> ${TMPDIR}/stat_${DATE}.lst
CONFI="$(sed -n '1p' ${TMPDIR}/stat_${DATE}.lst)"
SIMPL="$(sed -n '2p' ${TMPDIR}/stat_${DATE}.lst)"

CONFIOLD="$(sed -n '1p' ${TMPDIR}/nb_old.lst)"

SIMPLOLD="$(sed -n '2p' ${TMPDIR}/nb_old.lst)"

cat ${TMPDIR}/nb_${DATE}.lst | sed -e 's%[^[:digit:]]%%g' > ${TMPDIR}/nb_old.lst

fi

if [ -f "${TMPDIR}/nb_votes_${DATE}.lst" ]

then

cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's%|%%g;s%[^[:digit:]]%%g' >> ${TMPDIR}/stat_${DATE}.lst

VENTE="$(sed -n '3p' ${TMPDIR}/stat_${DATE}.lst)"
LOC="$(sed -n '4p' ${TMPDIR}/stat_${DATE}.lst)"
VENTEOLD="$(sed -n '1p' ${TMPDIR}/nb_votes_old.lst)"

LOCOLD="$(sed -n '2p' ${TMPDIR}/nb_votes_old.lst)"
cat ${TMPDIR}/nb_votes_${DATE}.lst | sed -e 's%[^[:digit:]]%%g' > ${TMPDIR}/nb_votes_old.lst

fi
sed -e "
s/\bCONFI\b/${CONFI}/
s/\bCONOLD\b/${CONOLD}/
s/\bSIMPL\b/${SIMPL}/
s/\bSIMOLD\b/${SIMOLD}/ "  toto.tpl | mail -s "Envoi du ${DATE}" toto@toto.fr


cela parse un fichier qui est un TEMPLATE dont le contenu ressemble a cela :

Bonjour,

Voici les stats au DATE

Nombre de votes simple et double au 16-05-2008 :
nombre de votes simples : 12546 ( contre 11652 en Avril 2008 )
nombre de votes double : 6523 ( contre 5698 en Avril 2008 )

je voudrais pouvoir egalement afficher les pourcentages du style :

Nombre de votes simple et double au 16-05-2008 :
nombre de votes simples : 12546 ( contre 11652 en Avril 2008 soit +20% )
nombre de votes double : 6523 ( contre 7698 en Avril 2008 soit - 37,2% )

Avez vous une idée comment je peux faire (avec SED,AWK ou autre..)

Merci








10 réponses

Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 887
Salut,

Dans ton script (qui ressemble à quelque chose près à ça pour ceux qui n'aurait pas suivi...), rajoute un truc du genre :
POURCENTAGE1=$(echo "scale=2;($CONFI - $CONFIOLD) * 100 / $CONFIOLD" | bc -l)
POURCENTAGE2=$(echo "scale=2;($SIMPL - $SIMOLD) * 100 / $SIMOLD" | bc -l)

puis dans la partie "sed" :
s/\bPOURCENTAGE1\b/${POURCENTAGE1}/
s/\bPOURCENTAGE2\b/${POURCENTAGE2}/

et dans ton TEMPLATE :
nombre de votants simples : VENTE (contre VENTEOLD en DATEOLD soit POURCENTAGE1%)
nombre de votants doubles : LOC (contre LOCOLD en DATEOLD soit POURCENTAGE2%)

et ça devrait le faire ;-))
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41713 internautes nous ont dit merci ce mois-ci

Messages postés
13087
Date d'inscription
lundi 28 janvier 2002
Statut
Webmaster
Dernière intervention
11 septembre 2021
418
Bonjour,

Je suis sympa, voilà une piste avec sed ET awk :-)
Piste:
~$ echo "nombre de votes simples : 12546 ( contre 11652 en Avril 2008 )" |sed -r -n 's/(nombre de votes [a-z]+ : ([0-9]+) \( contre ([0-9]+) en [A-Z][a-z]+ [0-9]{4} )(\))/\1|\2|\3|\4/p' |awk 'BEGIN{ FS = "|" }{ printf "%s soit %+.2f%% %s\n",$1,($2-$3)/$3*100,$4 }'

Exemple:
~$ cat plop Bonjour,

Voici les stats au DATE

Nombre de votes simple et double au 16-05-2008 :
nombre de votes simples : 12546 ( contre 11652 en Avril 2008 )
nombre de votes double : 6523 ( contre 5698 en Avril 2008 ) 
~$ sed -r 's/(nombre de votes [a-z]+ : ([0-9]+) \( contre ([0-9]+) en [A-Z][a-z]+ [0-9]{4} )(\))/\1|\2|\3|\4/' plop |awk 'BEGIN{ FS = "|" }/nombre de vote/{ printf "%s soit %+.2f%% %s\n",$1,($2-$3)/$3*100,$4 }!/nombre de vote/{ print $0 }'
Bonjour,

Voici les stats au DATE

Nombre de votes simple et double au 16-05-2008 :
nombre de votes simples : 12546 ( contre 11652 en Avril 2008  soit +7,67% )
nombre de votes double : 6523 ( contre 5698 en Avril 2008  soit +14,48% ) 
Messages postés
607
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
15 octobre 2021
18
Merci beaucoup pour la piste,

je vais l'étudier afin de la comprendre d'une part puis après voir comment je peux l'appliquer dans mon script car je dois appliquer cela sur une dizaine de lignes que contient mon fichier
Messages postés
607
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
15 octobre 2021
18
Merci beaucoup jipicy,

mais j'ai une question .De la maniére que tu m'indiques je dois déclaré une variable POURCENTAGE pour chaque lignes. Je pense qu'il doit être possible d'appliquer cela directement au fichier avant de l'envoyer au lieu de déclarer autant de variables !!Non?
Messages postés
607
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
15 octobre 2021
18 >
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020

Bin non car j'ai donné pour exemple que deux lignes mais j'ai au moins 10 lignes a traiter donc il faut que je declare une variable par lignes d'apres ton exemple si j'ai bien compris
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 887 >
Messages postés
607
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
15 octobre 2021

Ben les 2 lignes que tu donnes ce sont les mêmes que dans le reste de ton script de départ, non ?
Le fait de rajouter le pourcentage n'est qu'une opération en plus par rapport au traitement initial, exact ?

Tout ce que j'ai fait, c'est de rajouter à ton script de départ 2 nouvelles variables, qui en plus sont le résultat basé sur le calcul de variables déjà existantes, ajouter 2 nouvelles lignes à la commande "sed" et rajouter 2 éléments à ton TEMPLATE.

Donc, ou j'ai mal compris ton besoin, ou on se comprend mal sur la finalité de la chose...

Dans ton script de départ la sortie envoyée par mail ressemblée à ça :
Nombre de votes simple et double au 16-05-2008 :
nombre de votes simples : 12546 ( contre 11652 en Avril 2008 )
nombre de votes double : 6523 ( contre 5698 en Avril 2008 )


et maintenant tu veux ça :
Nombre de votes simple et double au 16-05-2008 :
nombre de votes simples : 12546 ( contre 11652 en Avril 2008 soit +20% )
nombre de votes double : 6523 ( contre 7698 en Avril 2008 soit - 37,2% )


Les autres valeurs tu les traites bien en une seule fois. Donc je vois pas où est le problème ?! ;-\
Messages postés
607
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
15 octobre 2021
18 >
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020

jipicy,
dans mon script de depart je n'avais mis que deux lignes pour exemple mais en fait la sortie envoyé par mail en comporte plus d'une dizaine il me faudrait donc déclarer 10 variables :

Nombre de votes simple et double au 16-05-2008 :
nombre de votes simples : 12546 ( contre 11652 en Avril 2008 )
nombre de votes double : 6523 ( contre 5698 en Avril 2008 )

Nombre de votants simple et double au 16-05-2008 :
nombre de votants simples : 23546 ( contre 54652 en Avril 2008 )
nombre de votants double : 641( contre 598 en Avril 2008 )

Nombre de com simple et double au 16-05-2008 :
nombre de com simples : 1246 ( cnotre 11652 en Avril 2008 )
nombre de com double : 6523 ( contre 5698 en Avril 2008 )
etc..

donc :

POURCENTAGE1
POURCENTAGE2
POURCENTAGE3
POURCENTAGE4
POURCENTAGE5
POURCENTAGE6
etc...

Merci et bonne soirée

L'accés au savoir est la premiére liberté de l'homme.
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 887 >
Messages postés
607
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
15 octobre 2021

Ok, je ne pouvais pas savoir.

Mais bon comme je te l'ai dit, tu déclares bien les autres variables et comme ces nouvelles variables (POURCENTAGEx) sont dépendantes des autres, j'entends par là qu'elles sont initialisées d'après les variables existantes, ça ne devrait pas poser de problèmes...

Si quelqu'un a mieux, je laisse volontiers la main ;-))
Messages postés
607
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
15 octobre 2021
18 >
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020

Par contre ce serait super sympa de ta part de m'expliquer ta ligne

POURCENTAGE1=$(echo "scale=2;($CONFI - $CONFIOLD) * 100 / $CONFIOLD" | bc -l)


car je ne veux pas faire du recopiage bêtement mais comprendre.

je connait scale qui determine le nombre de chiffres apres la virgule. Je sais que bc est une sorte de super calculette si je ne me trompe pas.

Merci
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 887
En fait on envoie un suite d'opération à effectuer à une calculatrice en ligne "bc".

echo
Pour envoyer la suite d'opérations comprise entre guillemets à "bc"

scale=2
Détermine le nombre de chiffre après la virgule en sortie. C'est une expression propre à "bc"

($CONFI - $CONFIOLD) * 100 / $CONFIOLD
On soustrait la valeur de $CONFIOLD de $CONFI qu'on multiplie par 100 et qu'on divise par la valeur de $CONFIOLD

| bc -l
Puis on passe le tout à "bc" (l'option "-l" pour définir la bibliothèque mathématique standard à employer)


Bon en y repensant, tu peux te servir du script d'asevere, mais il te faudra soit générer un fichier temporaire et le parser avec ledit script, soit intercaler le traitement en sortie entre la fin du filtrage par "sed" et l'envoi du mail...
Messages postés
607
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
15 octobre 2021
18
J'ai un souci je ne voit pas le script de asevere en totalite sur le forum il est couper sur la droite. Peux tu me le remttre si toi tu le voit en entier avec la partie de AWK. De plus est ce que cela qui suit te semple correct?

Ah oui dans ta façon de faire j'ai teste en console les resultats s'affichent sans le + ou le - devant selon le résultat ?

Merci encore

fi
sed -e "
s/\bCONFI\b/${CONFI}/
s/\bCONOLD\b/${CONOLD}/
s/\bSIMPL\b/${SIMPL}/
s/\bSIMOLD\b/${SIMOLD}/ "  toto.tpl | 
sed -r 's/(nombre de votes [a-z]+ : ([0-9]+) \( contre ([0-9]+) en [A-Z][a-z]+ [0-9]{4} )(\ 
| mail -s "Envoi du ${DATE}" toto@toto.fr
 --
L'accés au savoir est la premiére liberté de l'homme.
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 887
Voilà le script d'Adrien adapté à tes besoins en partant de cet exemple en sortie...
Exemple :
Bonjour,

Voici les stats au 16-05-2008 :

Nombre de votes simple et double au 16-05-2008 :
nombre de votes simples : 12546 ( contre 11652 en Avril 2008 )
nombre de votes double : 6523 ( contre 5698 en Avril 2008 )

Nombre de votants simple et double au 16-05-2008 :
nombre de votants simples : 23546 ( contre 54652 en Avril 2008 )
nombre de votants double : 641 ( contre 598 en Avril 2008 )

Nombre de com simple et double au 16-05-2008 :
nombre de com simples : 1246 ( contre 11652 en Avril 2008 )
nombre de com double : 6523 ( contre 5698 en Avril 2008 )
Et le script :
sed -r '
s/(nombre .*[a-z]+ : ([0-9]+) \( contre ([0-9]+) en [A-Z][a-z]+ [0-9]{4} )(\))/\1|\2|\3|\4/
' plop | awk '
BEGIN{
FS = "|"
}
/nombre /{
printf "%s soit %+.2f%% %s\n",$1,($2-$3)/$3*100,$4
}
!/nombre /{
print $0
}' 
Voilà donc le code qu'il te faudrait intercaler comme tu l'as fait ci-dessus, mais sans le fichier "plop" ça va de soi ;-))

Par contre il est vrai que dans ma façon de faire je n'ai pas le signe "+" qui s'affiche, par contre chez moi le signe "-" lui s'affiche ;-\
Messages postés
607
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
15 octobre 2021
18
Hélas cela ne fonctionne pas :

voici ma portion de script :

sed -e "
s/\bSIMPL\b/${SIMPL}/
s/\bSIMOLD\b/${SIMOLD}/
s/\bDATOLD\b/${DATOLD}/
" votes.tpl | sed -r '
s/(nombre .*[a-z]+ : ([0-9]+) \( contre ([0-9]+) en [A-Z][a-z]+ [0-9]{4} )(\))/\1|\2|\3|\4/
' | awk '
BEGIN{
FS = "|"
}
/nombre /{
printf "%s soit %+.2f%% %s\n",$1,($2-$3)/$3*100,$4
}
!/nombre /{
print $0
}' | mail -s " votes au ${DATE}" toto@toto.fr
et voila le résultat :

Bonjour,

Voici les stats au 16-05-2008 :

Nombre de votes simple et double au 16-05-2008 :
nombre de votes simples : 12546 ( contre 11652 en Avril 2008 )soit +nan% nombre de votes simples : 57537 ( contre 57537 au 1er April 2008 ) soit +nan%


nombre de votes double : 6523 ( contre 5698 en Avril 2008 )

Nombre de votants simple et double au 16-05-2008 :
nombre de votants simples : 23546 ( contre 54652 en Avril 2008 )
nombre de votants double : 641 ( contre 598 en Avril 2008 )soit +nan% nombre de votants doubles : 7513 ( contre 7513 au 1er April 2008 ) soit +nan%

Nombre de com simple et double au 16-05-2008 :
nombre de com simples : 1246 ( contre 11652 en Avril 2008 )
nombre de com double : 6523 ( contre 5698 en Avril 2008 )
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 887
Affiches-nous la sortie de :
sed -e "
s/\bSIMPL\b/${SIMPL}/
s/\bSIMOLD\b/${SIMOLD}/
s/\bDATOLD\b/${DATOLD}/
" votes.tp
Entre balises < code > pour qu'on ait bien la mise en page...

Voilà quand même le résultat que j'obtiens chez moi :
[tmpfs]$ cat plop
Bonjour,

Voici les stats au 16-05-2008 :

Nombre de votes simple et double au 16-05-2008 :
nombre de votes simples : 12546 ( contre 11652 en Avril 2008 )
nombre de votes double : 6523 ( contre 5698 en Avril 2008 )

Nombre de votants simple et double au 16-05-2008 :
nombre de votants simples : 23546 ( contre 54652 en Avril 2008 )
nombre de votants double : 641 ( contre 598 en Avril 2008 )

Nombre de com simple et double au 16-05-2008 :
nombre de com simples : 1246 ( contre 11652 en Avril 2008 )
nombre de com double : 6523 ( contre 5698 en Avril 2008 )

[tmpfs]$ sed -r '
s/(nombre .*[a-z]+ : ([0-9]+) \( contre ([0-9]+) en [A-Z][a-z]+ [0-9]{4} )(\))/\1|\2|\3|\4/
' plop | awk '
BEGIN{
FS = "|"
}
/nombre /{
printf "%s soit %+.2f%% %s\n",$1,($2-$3)/$3*100,$4
}
!/nombre /{
print $0
}'
Bonjour,

Voici les stats au 16-05-2008 :

Nombre de votes simple et double au 16-05-2008 :
nombre de votes simples : 12546 ( contre 11652 en Avril 2008  soit +7,67% )
nombre de votes double : 6523 ( contre 5698 en Avril 2008  soit +14,48% )

Nombre de votants simple et double au 16-05-2008 :
nombre de votants simples : 23546 ( contre 54652 en Avril 2008  soit -56,92% )
nombre de votants double : 641 ( contre 598 en Avril 2008  soit +7,19% )

Nombre de com simple et double au 16-05-2008 :
nombre de com simples : 1246 ( contre 11652 en Avril 2008  soit -89,31% )
nombre de com double : 6523 ( contre 5698 en Avril 2008  soit +14,48% )

[tmpfs]$
;-))

Messages postés
607
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
15 octobre 2021
18
la sortie de :

sed -e "
s/\bDATE\b/${DATE}/
s/\bVOTE\b/${VOTE}/
s/\bPOLD\b/${POLD}/
s/\bNEW\b/${NEW}/
s/\bNOLD\b/${NOLD}/
s/\bCDC\b/${CDC}/
s/\bCCOLD\b/${CCOLD}/
s/\bVENTE\b/${VENTE}/
s/\bVEOLD\b/${VEOLD}/
s/\bLOC\b/${LOC}/
s/\bLOLD\b/${LOLD}/
s/\bCONFI\b/${CONFI}/
s/\bCONOLD\b/${CONOLD}/
s/\bSIMPL\b/${SIMPL}/
s/\bSIMOLD\b/${SIMOLD}/
s/\bDATOLD\b/${DATOLD}/
" votes.tpl 

et :

Bonjour,

Voici les votes au 18-05-2008

Votes :
il y a 19714 votes du site ( contre 19714 au 1er April 2008 )

New :
il y a 37498 inscriptions à la news du site ( contre 37495 au 1er April 2008 )

CD :
il y a 158 cd ( contre 158 au 1er April 2008 )

Nombre de votes simple et double au 16-05-2008 :
nombre de votes simples : 12546 ( contre 11652 en Avril 2008 soit +7,67% )
nombre de votes double : 6523 ( contre 5698 en Avril 2008 soit +14,48% )

Nombre de votants simple et double au 16-05-2008 :
nombre de votants simples : 23546 ( contre 54652 en Avril 2008 soit -56,92% )
nombre de votants double : 641 ( contre 598 en Avril 2008 soit +7,19% )

Bonne journée.
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 887 >
Messages postés
607
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
15 octobre 2021

Et alors, où est le problème !? ;-\
Messages postés
607
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
15 octobre 2021
18 >
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020

Désole je me suis plante en faite voila la sortie sans le bout de code pour les pourcentages :

sed -e "
s/\bDATE\b/${DATE}/
s/\bVOTE\b/${VOTE}/
s/\bPOLD\b/${POLD}/
s/\bNEW\b/${NEW}/
s/\bNOLD\b/${NOLD}/
s/\bCDC\b/${CDC}/
s/\bCCOLD\b/${CCOLD}/
s/\bVENTE\b/${VENTE}/
s/\bVEOLD\b/${VEOLD}/
s/\bLOC\b/${LOC}/
s/\bLOLD\b/${LOLD}/
s/\bCONFI\b/${CONFI}/
s/\bCONOLD\b/${CONOLD}/
s/\bSIMPL\b/${SIMPL}/
s/\bSIMOLD\b/${SIMOLD}/
s/\bDATOLD\b/${DATOLD}/
" votes.tpl 


Résultat :

Bonjour,

Voici les votes au 18-05-2008

Votes :
il y a 19714 votes du site ( contre 19714 au 1er April 2008 )

New :
il y a 37498 inscriptions à la news du site ( contre 37495 au 1er April 2008 )

CD :
il y a 158 cd ( contre 158 au 1er April 2008 )

Nombre de votes simple et double au 16-05-2008 :
nombre de votes simples : 12546 ( contre 11652 en Avril 2008 )
nombre de votes double : 6523 ( contre 5698 en Avril 2008 )

Nombre de votants simple et double au 16-05-2008 :
nombre de votants simples : 23546 ( contre 54652 en Avril 2008 )
nombre de votants double : 641 ( contre 598 en Avril 2008 )

Bonne journée.

et avec le bout de code pour les poucentages :

sed -e "
s/\bDATE\b/${DATE}/
s/\bVOTE\b/${VOTE}/
s/\bPOLD\b/${POLD}/
s/\bNEW\b/${NEW}/
s/\bNOLD\b/${NOLD}/
s/\bCDC\b/${CDC}/
s/\bCCOLD\b/${CCOLD}/
s/\bVENTE\b/${VENTE}/
s/\bVEOLD\b/${VEOLD}/
s/\bLOC\b/${LOC}/
s/\bLOLD\b/${LOLD}/
s/\bCONFI\b/${CONFI}/
s/\bCONOLD\b/${CONOLD}/
s/\bSIMPL\b/${SIMPL}/
s/\bSIMOLD\b/${SIMOLD}/
s/\bDATOLD\b/${DATOLD}/
" votes.tpl | sed -r '
s/(nombre .*[a-z]+ : ([0-9]+) \( contre ([0-9]+) en [A-Z][a-z]+ [0-9]{4} )(\))/\1|\2|\3|\4/
' | awk '
BEGIN{
FS = "|"
}
/nombre /{
printf "%s soit %+.2f%% %s\n",$1,($2-$3)/$3*100,$4
}
!/nombre /{
print $0
}' | mail -s " votes au ${DATE}" toto@toto.fr


Résultat :

Bonjour,

Voici les votes au 18-05-2008

Votes :
il y a 19714 votes du site ( contre 19714 au 1er April 2008 )

New :
il y a 37498 inscriptions à la news du site ( contre 37495 au 1er April 2008 )

CD :
il y a 158 cd ( contre 158 au 1er April 2008 )

Nombre de votes simple et double au 16-05-2008 :
nombre de votes simples : 12546 ( contre 11652 en Avril 2008 ) soit +nan%
nombre de votes double : 6523 ( contre 5698 en Avril 2008 ) soit +nan%

Nombre de votants simple et double au 16-05-2008 :
nombre de votants simples : 23546 ( contre 54652 en Avril 2008 ) soit +nan%
nombre de votants double : 641 ( contre 598 en Avril 2008 ) soit +nan%

Bonne journée.

voila

Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 887
Tiens j'ai un peu remanié la syntaxe de "sed" et de "awk", et voilà ce que ça donne :
[tmpfs]$ cat pcsystemd
Bonjour,

Voici les votes au 18-05-2008

Votes :
il y a 19714 votes du site ( contre 19714 au 1er April 2008 )

New :
il y a 37498 inscriptions à la news du site ( contre 37495 au 1er April 2008 )

CD :
il y a 158 cd ( contre 158 au 1er April 2008 )

Nombre de votes simple et double au 16-05-2008 :
nombre de votes simples : 12546 ( contre 11652 en Avril 2008 )
nombre de votes double : 6523 ( contre 5698 en Avril 2008 )

Nombre de votants simple et double au 16-05-2008 :
nombre de votants simples : 23546 ( contre 54652 en Avril 2008 )
nombre de votants double : 641 ( contre 598 en Avril 2008 )

Bonne journée.

[tmpfs]$ sed -r '
/\(.*\)/ s/([^0-9]*)([0-9]+)([^0-9]*)([0-9]+)(.*)\)/\1\2\3\4\5|\2|\4|)/
' pcsystemd | awk '
BEGIN{
FS = "|"
}
/il / || /nombre /{
printf "%s soit %+.2f%% %s\n",$1,($2-$3)/$3*100,$4
}
!/il / && !/nombre /{
print $0
}'

Bonjour,

Voici les votes au 18-05-2008

Votes :
il y a 19714 votes du site ( contre 19714 au 1er April 2008  soit +0,00% )

New :
il y a 37498 inscriptions à la news du site ( contre 37495 au 1er April 2008  soit +0,01% )

CD :
il y a 158 cd ( contre 158 au 1er April 2008  soit +0,00% )

Nombre de votes simple et double au 16-05-2008 :
nombre de votes simples : 12546 ( contre 11652 en Avril 2008  soit +7,67% )
nombre de votes double : 6523 ( contre 5698 en Avril 2008  soit +14,48% )

Nombre de votants simple et double au 16-05-2008 :
nombre de votants simples : 23546 ( contre 54652 en Avril 2008  soit -56,92% )
nombre de votants double : 641 ( contre 598 en Avril 2008  soit +7,19% )

Bonne journée.
[tmpfs]$
;-))
Messages postés
607
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
15 octobre 2021
18
Merci énormement je vais étudié la synthase pour la comprendre en lisant de nouveau ton tuto sur SED puis je regarderais pour AWK puis je la testerais.

Merci encore
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 887
Explications syntaxe sed :

-r
Le switch pour signifier qu'on va utiliser les expression régulières étendues (pas besoin de les protéger)

/\(.*\)/
On cible uniquement les lignes comprenant des parenthèses

s/
Commande de substitution

([^0-9]*)
1ère sous-expression matchant tous les caractères jusqu'à ce qu'elle rencontre un caractère numérique

([0-9]+)
2ème sous-expression matchant uniquement une suite de caractères numériques

([^0-9]*)([0-9]+)
3ème et 4ème sous-expression identique aux 2 1ères

(.*)\)
5ème sous-expression matchant la fin de la ligne à l'exception de la parenthèse finale

/\1\2\3\4\5|\2|\4|)/
Substitution replaçant chaque sous-expression selon nos besoins


Explications syntaxe awk :

BEGIN{
FS = "|"
}

Définition du caractère délimiteur, le pipe (|)


/il / || /nombre /{
Si une ligne contient le motif "il " OU le motif "nombre "

printf "%s soit %+.2f%% %s\n",$1,($2-$3)/$3*100,$4
}

La formater selon l'expression définie

!/il / && !/nombre /{

Si une ligne ne contient ni le motif "il " ET ni le motif "nombre "

print $0
}'

La retranscrire tel quel.

Messages postés
607
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
15 octobre 2021
18
Merci jipicy,

effectivement les deux premieres lignes contiennent dans le texte des nombres du style :

Votes :
il y a 19714 inscriptions au site de pcsystemd 45 Espagne ( contre 19714 au 1er April 2008 soit +93776.19% )

New :
il y a 37523 inscriptions news au site de pcsystemd 12 Chine( contre 37515 au 1er April 2008 soit +178580.95% )

Je comprends mieux pourquoi un tel résultat pour ces deux lignes. Bon je vais essayé d'adapter le script .

Merci beaucoup
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 887
Tiens avec cette petite correction ça devrait aller mieux :
sed -r '
/\(.*\)/ s/([^0-9]*)([0-9]+)(.*\([^0-9]*)([0-9]+)(.*)\)/\1\2\3\4\5|\2|\4|)/
' pcsystemd | awk '
BEGIN{
FS = "|"
}
/il / || /nombre /{
printf "%s soit %+.2f%% %s\n",$1,($2-$3)/$3*100,$4
}
!/il / && !/nombre /{
print $0
}'
;-))
Messages postés
607
Date d'inscription
dimanche 27 novembre 2005
Statut
Membre
Dernière intervention
15 octobre 2021
18
Merci mille fois. Cette fois cela fonctionne parfaitement.

Bonne soirée.