exemple de code en shell/awk pas clair

Bayrouni bayrouni at brutele.be
Fri Feb 17 14:46:52 CET 2006


Christophe Martin wrote:

>Bayrouni a écrit :
>  
>
>>moi :(
>>md5sum "$@" /dev/null 2> /dev/null |
>>   awk '{
>>          compteurs[$1]++
>>          if (compteurs[$1] == 1) premiers[$1] = $0
>>          if (compteurs[$1] == 2) print premiers[$1]
>>          if (compteurs[$1] > 1)  print $0
>>        }' |
>>       sort |awk '{
>>                  if (dernier != $1) print ""
>>                  dernier = $1
>>                  print
>>                }'
>>           awk '{
>>    
>>
>L'idee est astucieuse : on suppose que s'il y a egalite de
>somme md5 alors il y a egalite de contenu de fichier.
>
>md5sum affiche sur chaque ligne : somme fichier
>
>l'idee est n'afficher les sommes et les fichiers que pour les fichiers
>qui ont des sommes identiques. puis trier par somme, comme ca les fichiers
>identiques sont rassembles en "serie" que l'on traite.
>
>pour cela il faudra memoriser toutes les sommes md5 : l'indice du tableau
>est le mot dont on veut compter la frequence. C'est un classique de awk
>	compteurs[$1]++
>
>si c'est la premiere fois qu'on voit cette somme, memoriser aussi la ligne comlete
>si c'est la deuxieme fois qu'on voit la somme, afficher la ligne vue la premier fois
>si c'est la nieme fois (n >= 2) qu'oit voi la somme, afficher la ligne
>  
>
>>   awk '{
>>          compteurs[$1]++
>>          if (compteurs[$1] == 1) premiers[$1] = $0
>>          if (compteurs[$1] == 2) print premiers[$1]
>>          if (compteurs[$1] > 1)  print $0
>>        }' |
>>    
>>
>
>ensuite trier par somme :
>sort
>
>ensuite afficher par bloque :
>si somme-courante differente de somme actuelle
>	afficher un saut de ligne
>afficher la ligne
>  
>
>>       sort |awk '{
>>                  if (dernier != $1) print ""
>>                  dernier = $1
>>                  print
>>                }'
>>    
>>
>
>Il y a tout de meme des astuces :
>compteurs[$1]++ :
>	un grand classique : pour compter les frequences d'un mot
>	++ fait reference en contexte numerique a un element de tableau
>	[$1] qui existe pas. il est donc cree avec une valeur nulle (0).
>
>et
>	if( dernier != $1 )
>	reference a la variable dernier qui existe pas (a la premiere boucle)
>	elle est donc cree avec une valeur vide.
>
>
>
>
>_______________________________________________
>Shell mailing list
>Shell at lists.asyd.net
>http://lists.asyd.net/mailman/listinfo.cgi/shell
>
>  
>
Merci pour tes explications claires.
Celà m'as permi de comprendre ce programme.
J'avoue que j'ai mis du temps pour le comprendre.
Maintenant il me semble clair :)

Merci beaucoup

-- 
Bayrouni

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.asyd.net/pipermail/shell/attachments/20060217/ac4a72e9/attachment-0001.html 


More information about the Shell mailing list