exemple de code en shell/awk pas clair

Christophe Martin christophe.martin at sdt.univ-brest.fr
Fri Feb 17 11:54:27 CET 2006



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.







More information about the Shell mailing list