IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

analyse de longueur de ligne dans fichier volumineux


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
     
    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

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    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.

  3. #3
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    awk '{
    if(length(line) == 150) then print line, else do nothing }'
    merci

  4. #4
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    bon j'ai trouvé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     awk 'length($0)>150 {print}' myFile >> anomalies.dat
    ya un moyen d'afficher le numéro de ligne avec ?


    Merci

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406

  6. #6
    Membre confirmé Avatar de KindPlayer
    Profil pro
    Inscrit en
    Février 2007
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 471
    Points : 477
    Points
    477
    Par défaut
    tu rajoutes print $NR je pense

  7. #7
    Membre habitué Avatar de lu6fer
    Inscrit en
    Avril 2008
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 141
    Points : 175
    Points
    175
    Par défaut
    pour le perl ca devrait effectivement etre plus rapide

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/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

  8. #8
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    Par défaut
    Merci

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Points : 406
    Points
    406
    Par défaut
    tu pourras nous dire la gain de vitesse qu'on ai une idée?

  10. #10
    Membre habitué Avatar de lu6fer
    Inscrit en
    Avril 2008
    Messages
    141
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 141
    Points : 175
    Points
    175
    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 +

  11. #11
    Membre régulier
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Points : 83
    Points
    83
    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 ..

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Librairies] Inserer lignes dans fichier RTF
    Par tit_oune dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 04/05/2012, 11h21
  2. ecrire a la ligne dans fichier texte.
    Par zulot dans le forum Langage
    Réponses: 7
    Dernier message: 12/09/2006, 13h02
  3. Longueur de ligne dans une équation
    Par milanista dans le forum Mathématiques - Sciences
    Réponses: 4
    Dernier message: 13/06/2006, 09h08
  4. prb retour a la ligne dans fichier txt telecharge avec php
    Par supersonicblonde dans le forum Langage
    Réponses: 3
    Dernier message: 08/06/2006, 15h20
  5. [Unix KSH] Ajout caractère fin de ligne dans fichier
    Par -COil- dans le forum Autres langages
    Réponses: 1
    Dernier message: 04/05/2006, 17h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo