<![CDATA[Forum Ubuntu-fr.org / [astuce/awk] pourquoi awk est si puissant ? un petit exemple]]> http://forum.ubuntu-fr.org/viewtopic.php?id=781721 Sat, 07 Jan 2012 17:10:21 +0000 FluxBB <![CDATA[Réponse à : [astuce/awk] pourquoi awk est si puissant ? un petit exemple]]> http://forum.ubuntu-fr.org/viewtopic.php?pid=7729731#p7729731 à utiliser bash ? pourquoi ?
de toute façon, en sh :

#!/bin/sh
LOCATIONS="FRXX0034 FRXX3641 FRXX0071"
for location in $LOCATIONS
do
    yweather $location &
done
]]>
Sat, 07 Jan 2012 17:10:21 +0000 http://forum.ubuntu-fr.org/viewtopic.php?pid=7729731#p7729731
<![CDATA[Réponse à : [astuce/awk] pourquoi awk est si puissant ? un petit exemple]]> http://forum.ubuntu-fr.org/viewtopic.php?pid=7725801#p7725801 nesthib a écrit :

tu aurais surtout pu tout faire en bash smile

Non, et je m'y refuse…

]]>
Sat, 07 Jan 2012 11:31:50 +0000 http://forum.ubuntu-fr.org/viewtopic.php?pid=7725801#p7725801
<![CDATA[Réponse à : [astuce/awk] pourquoi awk est si puissant ? un petit exemple]]> http://forum.ubuntu-fr.org/viewtopic.php?pid=7725791#p7725791 tu aurais surtout pu tout faire en bash smile

#!/bin/bash
LOCATIONS=(FRXX0034 FRXX3641 FRXX0071)
for location in ${LOCATIONS[@]}
do
    yweather $location &
done

là, l'utilisation d'awk pour faire une boucle et lancer une commande est un peu superflue

(NB. pour ceux qui veulent tester le script yweather présenté ci-dessus, le lien)

]]>
Sat, 07 Jan 2012 11:29:00 +0000 http://forum.ubuntu-fr.org/viewtopic.php?pid=7725791#p7725791
<![CDATA[Réponse à : [astuce/awk] pourquoi awk est si puissant ? un petit exemple]]> http://forum.ubuntu-fr.org/viewtopic.php?pid=7725521#p7725521
#!/bin/sh

LOCATIONS="FRXX0034 FRXX3641 FRXX0071"
main() {
    echo $LOCATIONS | \
    awk '{ for (i = 1; i <= NF; i++) system("yweather " $i " &") }'
}

main

J'aurais certainement pu tout faire en awk… mais c'est un script sh

]]>
Sat, 07 Jan 2012 11:00:04 +0000 http://forum.ubuntu-fr.org/viewtopic.php?pid=7725521#p7725521
<![CDATA[Réponse à : [astuce/awk] pourquoi awk est si puissant ? un petit exemple]]> http://forum.ubuntu-fr.org/viewtopic.php?pid=7722621#p7722621 Alors vue que nesthib m' a demandé de voir qu'est ce que ça peux donner une version en python voila ce que je trouve

from itertools import groupby
from operator import itemgetter
import re
a = [re.findall(r'\w+', j)[6] for j in open('log.ex').readlines()]
a.sort()
b = [(i, len(list(l))) for i, l in groupby(a)]
b.sort(key= itemgetter(1), reverse = True)
print "\n".join(["%s %s" % c for c in b])
]]>
Fri, 06 Jan 2012 22:22:30 +0000 http://forum.ubuntu-fr.org/viewtopic.php?pid=7722621#p7722621
<![CDATA[[astuce/awk] pourquoi awk est si puissant ? un petit exemple]]> http://forum.ubuntu-fr.org/viewtopic.php?pid=7721861#p7721861 une petite astuce pour montrer la puissance d'awk (et plus généralement des « petits » programmes en ligne de commande)

j'avais un fichier de log de la forme :

20xx-xx-xx xx:xx:xx username1 Lorem ipsum dolor sit amet
20xx-xx-xx xx:xx:xx username2 consectetur adipisicing elit, sed do eiusmod tempor 
20xx-xx-xx xx:xx:xx username3 incididunt ut labore et dolore magna aliqua
20xx-xx-xx xx:xx:xx username1 Ut enim ad minim veniam, quis nostrud 
20xx-xx-xx xx:xx:xx username3 exercitation ullamco laboris nisi ut aliquip
20xx-xx-xx xx:xx:xx username1 ex ea commodo consequat.
[…]

je voulais faire quelques statistiques pour compter le nombre de lignes ou de mots par username, ce qui, vous allez le voir, se fait simplement avec awk.
pour le nombre de lignes :

awk '{ names[$3]++ } END { for (name in names) print name, names[name] }' log

pour le nombre de mots :

awk '{ names[$3]+=(NF-3) } END { for (name in names) print name, names[name] }' log

et donne respectivement  les résultats :

username1 3
username2 1
username3 2
username1 19
username2 8
username3 15

bien sûr il est possible de faire les deux à la fois :

awk '{ lignes[$3]++ ; mots[$3]+=(NF-3) } END { for (name in lignes) print name, lignes[name], mots[name] }' log

pour obtenir :

username1 3 19
username2 1 8
username3 2 15

pour trier par ordre décroissant on peut combiner awk et sort :

awk '{ names[$3]+=(NF-3) } END { for (name in names) print names[name], name }' log | sort -nr

ce qui donne :

19 username1
15 username3
8 username2

un petit hack un peu plus compliqué, pour trier sans utiliser sort (awk n'est pas vraiment fait pour trier facilement) :

awk '{ names[$3]+=(NF-3) } END { for (name in names) x[name]=sprintf("%5d %s", names[name], name) ; n=asort(x) ; for (i=n;i>0;i--) print x[i] }' log

Rien de bien extraordinaire, mais j'espère que ça donnera l'envie d'utiliser la ligne de commande (et awk) à ceux qui n'osent pas ou n'y pensent pas.
Et pour ceux qui ne sont toujours pas convaincus, il suffit d'une ligne de code et d'une demi seconde pour analyser un fichier de plusieurs centaines de milliers de lignes.

]]>
Fri, 06 Jan 2012 21:31:11 +0000 http://forum.ubuntu-fr.org/viewtopic.php?pid=7721861#p7721861