Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 09/08/2006, 18h11   #1
Invité de passage
 
Inscription : août 2006
Messages : 2
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 2
Points : 0
Points : 0
Par défaut Optimisation shell script

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 mais je cherche désormais à "optimiser" mon script, ce qui est moins évident...

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
Burrito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2006, 18h26   #2
Rédacteur/Modérateur
 
Avatar de gorgonite
 
Homme Nicolas Vallée
Ingénieur Système
Inscription : décembre 2005
Messages : 9 774
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Vallée
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Ingénieur Système
Secteur : Transports

Informations forums :
Inscription : décembre 2005
Messages : 9 774
Points : 14 303
Points : 14 303
perso, je me tournerais vers perl... afin de pouvoir lire ligne par ligne

sinon en shell, je verrais bien cela :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
nbOccur1=0
# idem pour les autres
FILE=`cat ${FILEPATH}`
for WORD in $FILE
do
    if [${WORD} -eq ${chaine1}]
    then
        LET nbOccur1=nbOccur1+1
    fi
    # idem pour les autres
done
echo "$nbOccur1" >> fichierSortie.txt
#idem pour les autres

mais ce sera très gourmand en mémoire
__________________
Evitez les MP pour les questions techniques... il y a des forums
Contributions sur DVP : Mes Tutos | Mon Blog
gorgonite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2006, 18h41   #3
Modérateur
 
Avatar de al1_24
 
Homme Alain
Ingénieur d'études décisionnel
Inscription : mai 2002
Messages : 4 446
Détails du profil
Informations personnelles :
Nom : Homme Alain
Âge : 51
Localisation : France, Val de Marne (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études décisionnel
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 4 446
Points : 7 546
Points : 7 546
Citation:
Envoyé par gorgonite
perso, je me tournerais vers perl... afin de pouvoir lire ligne par ligne
Ou bien avec awk
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
Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours 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
al1_24 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2006, 18h55   #4
Rédacteur/Modérateur
 
Avatar de gorgonite
 
Homme Nicolas Vallée
Ingénieur Système
Inscription : décembre 2005
Messages : 9 774
Détails du profil
Informations personnelles :
Nom : Homme Nicolas Vallée
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Ingénieur Système
Secteur : Transports

Informations forums :
Inscription : décembre 2005
Messages : 9 774
Points : 14 303
Points : 14 303
Citation:
Envoyé par al1_24
Ou bien avec awk
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

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é
__________________
Evitez les MP pour les questions techniques... il y a des forums
Contributions sur DVP : Mes Tutos | Mon Blog
gorgonite est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/08/2006, 19h24   #5
Invité de passage
 
Inscription : août 2006
Messages : 2
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 2
Points : 0
Points : 0
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
Burrito est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/08/2006, 10h59   #6
Modérateur
 
Avatar de gangsoleil
 
R&D en systemes informatiques bas niveau Unix/Linux
Inscription : mai 2004
Messages : 5 497
Détails du profil
Informations personnelles :
Âge : 31
Localisation : France, Isère (Rhône Alpes)

Informations professionnelles :
Activité : R&D en systemes informatiques bas niveau Unix/Linux

Informations forums :
Inscription : mai 2004
Messages : 5 497
Points : 9 672
Points : 9 672
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
Code :
grep "fhdjsqkfhk" fichier | wc -l
par
Code :
grep -c "fhdjsqkfhk" fichier
ce qui t'évite une indirection
__________________
Modérateur "C", "Informatique Générale & Hardware" et "Unix"
Les règles du forum
gangsoleil est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2006, 20h33   #7
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
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 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# compte nombre d'occurences d'une série de mots
# utilisation : awk -f wc.awk fichier.a.tester
 
BEGIN {
    mots[1] = "exemple"
    mots[2] = "programme"
}
 
{
    for (i in mots)
        if (index($0, mots[i]))
            wc[i]++
}
 
END {
    for (i in mots)
        print "Le mot: ", mots[i], " apparaît ", wc[i], "fois"
}
__________________
: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
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 11h09   #8
Rédacteur
 
Inscription : mars 2004
Messages : 1 298
Détails du profil
Informations forums :
Inscription : mars 2004
Messages : 1 298
Points : 1 450
Points : 1 450
avec egrep pour ne lire qu'une seul fois le(s) fichiers et un ou :
Code :
1
2
 
egrep 'chaine1|chaine3|chaine3' fic1 ...
__________________
Marc
Slackware for ever ......
BASH - KSH ( http://marcg.developpez.com/ksh/ )
MarcG est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/08/2006, 22h12   #9
Membre émérite
 
Inscription : mai 2004
Messages : 709
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : mai 2004
Messages : 709
Points : 852
Points : 852
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
ripat est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 00h33.


 
 
 
 
Partenaires

Hébergement Web