Calculer un pourcentage script shell sed,awk.

Résolu/Fermé
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 - 16 mai 2008 à 14:41
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 - 18 mai 2008 à 21:03
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








A voir également:

10 réponses

jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
16 mai 2008 à 16:56
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
asevere Messages postés 13084 Date d'inscription lundi 28 janvier 2002 Statut Webmaster Dernière intervention 3 février 2022 426
16 mai 2008 à 15:34
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% ) 
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
16 mai 2008 à 16:28
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
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
16 mai 2008 à 17:11
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?
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
16 mai 2008 à 17:20
Ben on déclare 2 variables de plus c'est tout, afin d'agrémenter ton TEMPLATE.

Si tu choisis la façon d'asevere, il te faudra passer par un fichier temporaire en sortie sur lequel tu appliqueras les commandes données, puis tu enverras ce fichier avant de le détruire, non ?
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
17 mai 2008 à 00:15
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
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894 > pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024
17 mai 2008 à 00:51
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 ?! ;-\
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
17 mai 2008 à 20:36
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.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894 > pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024
17 mai 2008 à 22:59
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 ;-))
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
18 mai 2008 à 00:27
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...
0

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

Posez votre question
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
18 mai 2008 à 00:52
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.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
18 mai 2008 à 10:59
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 ;-\
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
18 mai 2008 à 12:52
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 )
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
18 mai 2008 à 13:19
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]$
;-))

0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
18 mai 2008 à 14:37
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.
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894 > pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024
18 mai 2008 à 14:58
Et alors, où est le problème !? ;-\
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22 > jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020
18 mai 2008 à 16:04
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

0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
18 mai 2008 à 16:56
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]$
;-))
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
18 mai 2008 à 16:59
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
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
18 mai 2008 à 17:23
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.

0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
18 mai 2008 à 19:36
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
0
jipicy Messages postés 40842 Date d'inscription jeudi 28 août 2003 Statut Modérateur Dernière intervention 10 août 2020 4 894
18 mai 2008 à 20:51
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
}'
;-))
0
pcsystemd Messages postés 691 Date d'inscription dimanche 27 novembre 2005 Statut Membre Dernière intervention 15 janvier 2024 22
18 mai 2008 à 21:03
Merci mille fois. Cette fois cela fonctionne parfaitement.

Bonne soirée.
0