![]() |
| Le forum de référence en programmation et développement. Articles, cours et tutoriels du débutant au chef de projet et DBA confirmé. | |||||||
|
|||||||
| Shell Vos questions sur l'utilisation des commandes shell |
![]() |
|
|
Outils de la discussion |
|
|
#1 (permalink) |
|
Membre éclairé
![]() Date d'inscription: septembre 2006
Messages: 311
|
Bonjour,
j'ai un fichier qui contient exactement 15 000 000 lignes (2,5 G) Chaque ligne doit avoir pour longueur 150 caractères. Cependant, il existe quleques unes qui dépassent cette longueur. Je voudrais écrire un script pour afficher ces lignes (avec leurs numéros) dans un fichier de log, et les supprimer du fichier initial (ou au pire créer un autre fichier sans ces lignes là) j'ai commencé avec ça pour tester, il a tourné toute la nuit et est encore à la ligne 134 000 !!! à ce rythme là il me faut des semaines Code :
COUNT=0 while read ligne do COUNT=$(expr $COUNT + 1) length=`echo "$ligne" | wc -m` echo $COUNT " : " $length if [ $length -gt 143 ] then echo $COUNT " : " $ligne >> anomalies.log else echo $ligne >> New_file.dat fi done < $myFile Merci |
|
|
|
|
|
#2 (permalink) |
|
Membre éprouvé
![]() Date d'inscription: décembre 2007
Messages: 482
|
à supposer que ta nuit ai fait 10h ca ferait 3.7 lignes par secondes, effectivement c'est long !
Peut etre que la combinaison echo et wc est pas très efficace. Tu devrais faire un essai en perl par exemple, surement plus efficace... C'est juste une idée comme ça, j'en sais pas plus. |
|
|
|
|
|
#3 (permalink) |
|
Membre éclairé
![]() Date d'inscription: septembre 2006
Messages: 311
|
je connais pas perl du tout
par contre, je connais un peu awk.. je sais que c'est plus efficace dans ce genre de manipulations.. sauf que je ne suis pas trop à l'aise dans awk est ce que quelqu'un peut m'aider à écrire un truc du genre : Code :
awk '{
if(length(line) == 150) then print line, else do nothing }'
|
|
|
|
|
|
#7 (permalink) |
|
Membre régulier
![]() Date d'inscription: avril 2008
Messages: 126
|
pour le perl ca devrait effectivement etre plus rapide
Code :
#!/usr/bin/perl
#
use strict;
use warnings;
my $cpt = 0;
while (<>) {
if ( /.{150,}/ ) {
print STDERR $cpt.';'.$_;
}
else {
print $_;
}
$cpt++;
}
./script.pl < fichier_A_Analyser > fichier_de_sortie_150_carac 2>log_n°ligne+ligne_trop_grande Après il y a moyen d'améliorer ca je pense, je l'ai fait juste pour l'exemple
__________________
"Le logiciel c'est comme le sexe, c'est meilleur quand c'est gratuit" Linus TORVALD |
|
|
|
|
|
#10 (permalink) |
|
Membre régulier
![]() Date d'inscription: avril 2008
Messages: 126
|
attention, j'ai du faire une erreur, de ce que j'ai compris, il faut que tu change le 150 par 151.
Car sinon tu matchera toutes tes ligne qui font 150 caractères et +
__________________
"Le logiciel c'est comme le sexe, c'est meilleur quand c'est gratuit" Linus TORVALD |
|
|
|
![]() |
![]() |
||
analyse de longueur de ligne dans fichier volumineux
|
||
| Outils de la discussion | |
|
|