exemple de code en shell/awk pas clair
Bonsoir à tous, Je suis en permanence les posts de la liste. Mais vu que je suis débutant en shell/awk/sed, je n'interviens que rarement. (quand j'ai une petite question :) Bien j'entre dans le vif du sujet. J'ai acheté le bouquin d'oreilly scripts shell. Mais il y a un exemple que je n'arrive pas à comprendre (il n'est pas vraiment expliqué). Voici l'exemple (je sais que c'est trop facil pour vous, mais pas pour 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 '{ C'est un script qui reçoit comme parametres un nombre de fichiers, et il a pour tache d'afficher les fichiers identiques, d'ailleurs son nom est aficher_fichiers_identiques. Pourriez-vous mettre aux moins des commentaires car je trouve que c'est trop hard pour un debutant. Merci d'avance -- Bayrouni
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.
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@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
Bayrouni <bayrouni@brutele.be> writes:
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
Tu pourrais essayer de configuré ton MUA pour qu'il quote correctement, ca serait chou :P Et généralement quand on fais un reply, on ne laisse de l'original que ce qui est nécessaire pour comprendre ce que toi tu dis ! mes deux cents de la netiquette -- http://asyd.net/home/
Bruno Bonfils wrote:
Tu pourrais essayer de configuré ton MUA pour qu'il quote correctement, ca serait chou :P Et généralement quand on fais un reply, on ne laisse de l'original que ce qui est nécessaire pour comprendre ce que toi tu dis !
mes deux cents de la netiquette
Je voudrais bien, mais je ne vois pas comment. Ici l'affichage me semble correct. A + -- Bayrouni
On 2006-02-17 11:54:27 +0100, Christophe Martin wrote:
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
Je ne sais pas quel est le contexte, mais rappelons que MD5 n'est pas cryptographiquement sûr. SHA-1 reste sûr pour le moment et semble être aussi rapide à calculer (par sha1sum). -- Vincent Lefèvre <vincent@vinc17.org> - Web: <http://www.vinc17.org/> 100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/> Work: CR INRIA - computer arithmetic / SPACES project at LORIA
participants (4)
-
Bayrouni
-
Bruno Bonfils
-
Christophe Martin
-
Vincent Lefevre