Bonjour,

Je cherche à améliorer un script shell pour qu'il soit plus rapide (actuellement il met entre 10 et 45 minutes pour tourner). C'est la commande grep qui fait perdre le plus de temps (car les fichiers sont très gros)
Donc je viens de faire des tests avec le fichier "fichier_test" qui ne fait que 16700 lignes (c'est loin de la taille des fichiers réels)

J'utilisais la commande suivante pour ne récupérer que les lignes ne commençant pas par un chiffre et ne faisant que 11 caractères :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
time grep -v ^[0-9] fichier_test | grep ^...........$
real    0m16.276s
user    0m16.239s
sys     0m0.030s
Comme finalement les lignes commencent normalement par une lettre j'ai testé cette commande (c'est beaucoup mieux)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
time grep -i ^[a-z] fichier_test | grep ^...........$
real    0m4.818s
user    0m4.789s
sys     0m0.046s
J'ai aussi testé un grep équivalent sans ignorer la casse (gain de 0.3 secondes)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
time grep ^[A-Za-z] fichier_test | grep ^...........$
real    0m4.553s
user    0m4.539s
sys     0m0.030s
Ou simplement les lignes de 11 caractères :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
time grep ^...........$ fichier_test
real    0m4.618s
user    0m4.617s
sys     0m0.015s
J'ai aussi testé en recherchant directement les lignes commençant par le résultat des tests. Je passe alors de plus de 4,5 secondes à 0,1 seconde
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
time grep -E "^ABCD|^EFGH" fichier_test | grep ^...........$
real    0m0.100s
user    0m0.123s
sys     0m0.015s
J'ai donc testé la recherche d'une ligne commençant par une lettre en les listant toutes. C'est ce qui me donne le résultat le plus performant.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
grep -E "^A|^B|^C|^D|^E|^F|^G|^H|^I|^J|^K|^L|^M|^N|^O|^P|^Q|^R|^S|^T|^U|^V|^W|^X|^Y|^Z|^a|^b|^c|^d|^e|^f|^g|^h|^i|^j|^k|^l|^m|^n|^o|^p|^q|^r|^s|^t|^u|^v|^w|^x|^y|^z" fichier_test | grep ^...........$
real    0m0.108s
user    0m0.108s
sys     0m0.030s
Pourquoi il y a-t-il temps de différence entre ces différentes commandes ?

Au final, je pense partir sur la commande sed :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
time sed -n '/^...........$/p' fichier_test
real    0m0.106s
user    0m0.078s
sys     0m0.030s
Elle semble légèrement plus rapide que la commande awk
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
time awk '/^...........$/ { print }' fichier_test
real    0m0.110s
user    0m0.093s
sys     0m0.030s
Merci

ps: en tout cas, ça va faire un gros coup de boost dans les performances du scripts (16 secondes => 0,1 secondes pour un "petit" fichier).