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@lists.asyd.net
http://lists.asyd.net/mailman/listinfo.cgi/shell
Merci pour tes explications claires.