Forum des développeurs  

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é.
Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Linux > Applications > Shell

Shell Vos questions sur l'utilisation des commandes shell

Réponse
 
Outils de la discussion
Vieux 16/07/2008, 13h47   #1 (permalink)
Membre éclairé
 
Date d'inscription: septembre 2006
Messages: 311
Par défaut analyse de longueur de ligne dans fichier volumineux

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
Des idées?
Merci
freestyler est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/07/2008, 14h03   #2 (permalink)
Membre éprouvé
 
Date d'inscription: décembre 2007
Messages: 482
Par défaut

à 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.
pasdeface est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/07/2008, 14h22   #3 (permalink)
Membre éclairé
 
Date d'inscription: septembre 2006
Messages: 311
Par défaut

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 }'
merci
freestyler est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/07/2008, 14h34   #4 (permalink)
Membre éclairé
 
Date d'inscription: septembre 2006
Messages: 311
Par défaut

bon j'ai trouvé

Code :
 awk 'length($0)>150 {print}' myFile >> anomalies.dat
ya un moyen d'afficher le numéro de ligne avec ?


Merci
freestyler est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/07/2008, 14h52   #5 (permalink)
Membre éprouvé
 
Date d'inscription: décembre 2007
Messages: 482
Par défaut

http://en.wikipedia.org/wiki/AWK_(pr...e)#Hello_World
pasdeface est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/07/2008, 14h57   #6 (permalink)
Membre éprouvé
 
Avatar de KindPlayer
 
Date d'inscription: février 2007
Messages: 451
Par défaut

tu rajoutes print $NR je pense
__________________
La science est ce que nous comprenons suffisamment bien pour l'expliquer à un ordinateur. L'art, c'est tout ce que nous faisons d'autre.
Donald E. Knuth
KindPlayer est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/07/2008, 17h11   #7 (permalink)
Membre régulier
 
Avatar de lu6fer
 
Date d'inscription: avril 2008
Messages: 126
Par défaut

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++;
}
pour l'utilisation :
./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
lu6fer est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/07/2008, 17h20   #8 (permalink)
Membre éclairé
 
Date d'inscription: septembre 2006
Messages: 311
Par défaut

Merci
freestyler est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 16/07/2008, 17h37   #9 (permalink)
Membre éprouvé
 
Date d'inscription: décembre 2007
Messages: 482
Par défaut

tu pourras nous dire la gain de vitesse qu'on ai une idée?
pasdeface est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 17/07/2008, 11h03   #10 (permalink)
Membre régulier
 
Avatar de lu6fer
 
Date d'inscription: avril 2008
Messages: 126
Par défaut

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
lu6fer est déconnecté   Envoyer un message privé Réponse avec citation
Vieux 22/07/2008, 16h41   #11 (permalink)
Membre éclairé
 
Date d'inscription: septembre 2006
Messages: 311
Par défaut

je n'ai pas essayé le perl. j'ai des performances satisfaisantes avec AWK ..
ça n'a rien à voir..
avec le shell, c'est quasiment de l'ordre des jours !!
avec awk, c'est 1 à 2 minutes max ..
freestyler est déconnecté   Envoyer un message privé Réponse avec citation
Réponse

Précédent   Forum des développeurs > Hardware, Systèmes et Logiciels > Linux > Applications > Shell



Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are non
Pingbacks are non
Refbacks are non
Navigation rapide