|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : août 2006 Messages : 2 ![]() |
Bonjour!
J'ai commencé il ny 'a pas longtemps à réaliser de petits scripts shells et jusque là j'ai réussi à créer les fonctionalités voulues en cherchant sur votre forum et avec mon ami google Je m'explique : mon but est de rechercher une dizaine d'éléments (figurant une fois par ligne) dans un très gros fichier texte (30 à 100 mo !) et d'afficher le nombre de leur occurences : - disons que je cherche les chaînes : chaîne1 , chaîne2, .... , chaîne10 - je crée les variables : nbOccur1='grep "chaîne1" monGrosFichier | wc -l' nbOccur2='grep "chaîne2" monGrosFichier | wc -l' ... nbOccur10='grep "chaîne10" monGrosFichier | wc -l' - et je les sors les résultats successivement ainsi : echo "$nbOccur1" >> fichierSortie.txt echo "$nbOccur2" >> fichierSortie.txt ... echo "$nbOccur10" >> fichierSortie.txt Mon soucis c'est que ce script que je fais boucler sur plusieurs fichiers texte assez gros ( > 30 Mo ) se fait en bcp trop de temps (pas loin d'une heure). Les données se trouvent, ca peut peut-être exliquer cela mais j'aurai voulu avoir votre avis sur une éventuelle optimisation de mon script. Je me demande s'il n'est pas possible de faire la recherche simultanément des 10 chaînes en ne parcourant le texte qu'une seule fois, au lieu de le parcourir 10 fois avec la recherche d'une seule chaîne... et pensez vous que cela prendrait moins de temps? Merci d'avance pour votre aide |
|
|
00
|
|
|
#2 | ||
![]() ![]() Nicolas ValléeIngénieur Système Inscription : décembre 2005 Messages : 9 774 ![]() |
perso, je me tournerais vers perl... afin de pouvoir lire ligne par ligne
sinon en shell, je verrais bien cela : Code :
mais ce sera très gourmand en mémoire |
||
|
|
00
|
|
|
#3 | |
![]() ![]() Alain Ingénieur d'études décisionnel Inscription : mai 2002 Messages : 4 446 ![]() |
Citation:
Ou tout simplement la commande read du shell associée à sed. Désolé je n'ai pas le temps de me pencher plus dessus, il est temps de quitter le travail
__________________
Modérateur Langage SQL N'oubliez pas le bouton et pensez aux balises [code]Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur ![]() |
|
|
|
00
|
|
|
#4 | |
![]() ![]() Nicolas ValléeIngénieur Système Inscription : décembre 2005 Messages : 9 774 ![]() |
Citation:
possible... mais dès que ça devient trop compliqué, en script système, je me tourne vers perl, puis faire les binaires en c... question de puissance de langage et de rapidité |
|
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : août 2006 Messages : 2 ![]() |
Merci beaucoup pour vos réponses !
Je vais implémenter vos solutions et tester sur un fichier d'essai l'efficacité des algorithmes. Sinon pour le Perl, j'avoue que je ne sais pas trop ce que c'est, est-ce aussi abordable que le shell script? L'avantage pour moi avec le shell script étant de pouvoir les lancer depuis windows sur le serveur unix via un .bat sans problème de droit ou autres... En tout cas je vais étudier la question. Je vous tiens au courant |
|
|
00
|
|
|
#6 |
![]() ![]() R&D en systemes informatiques bas niveau Unix/Linux Inscription : mai 2004 Messages : 5 497 ![]() |
Bonjour,
Pour optimiser un shell script, une bonne solution peut consister à regarder les options des commandes utilisées. Par exemple, tu peux tout à fait remplacer par ce qui t'évite une indirection |
|
|
00
|
|
|
#7 | ||
|
Membre émérite
![]() Inscription : mai 2004 Messages : 709 ![]() |
Le but est d'essayer de ne parcourir qu'une seule fois tout le fichier. Awk fera l'affaire, en une seule passe.
script wc.awk Code :
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT Jabber: ripat at im.apinc.org |
||
|
|
00
|
|
|
#8 | ||
![]() Inscription : mars 2004 Messages : 1 298 ![]() |
avec egrep pour ne lire qu'une seul fois le(s) fichiers et un ou :
Code :
|
||
|
|
00
|
|
|
#9 |
|
Membre émérite
![]() Inscription : mai 2004 Messages : 709 ![]() |
grep ne comptera, tout au plus, que le nombre de lignes où au moins un des mots est présent (option --count) mais ne présentera pas de comptage séparé par mot.
De toute façon, il a l'air d'avoir disparu de la circulation, notre posteur!
__________________
:q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT Jabber: ripat at im.apinc.org |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com