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 :

optimiser "nettoyage" d'un fichier


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut optimiser "nettoyage" d'un fichier
    Bonjour,

    je cherche un moyen efficace pour "nettoyer" un fichier. (Article ---Nombre)
    je parcours mon fichier. Si les 5 premieres lignes ont TOUS un nombre égal à 0, je vire ces lignes du fichier.

    Ce que je fais pour le moment, c'est :

    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
    17
    18
    19
    20
     
    #Nombre de lignes
    COUNT=`cat $MyFile | wc -l`
     
    #Nombre de fois que je dois répéter tout ceci
    repeat=$(expr $COUNT / 5)
     
    head -l 5 $MyFile > temp.txt
     
    #"Nombre" commence à la colonne 21 du fichier texte
    result=`awk ' {
    printf ( "%s" , substr($0, 21, 20))
    } ' temp.out | tr -d "0"`
     
    if [ $result=="" ] 
    then
    	COUNT=$(expr $COUNT - 5)
    	tail -l $COUNT $MyFile > temp.txt
    	cat temp.txt > $MyFile
    fi
    et puis répéter ceci $repeat fois ..

    Ceci prend beaucoup de temps pour un fichier de 700000 lignes ..
    surtout la partie du if ..

    il doit surement y avoir un autre moyen de le faire..

    qqn a une idée?? Merci

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Pour ce genre de problème, il est plus facile de nous donner une exemple type de fichier de base et de ce que tu veux obtenir en sortie.

  3. #3
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    ya rien de plus simple
    fichier à 2 colonnes..
    comme ci joint

    Ce que je voudrais faire, c'est virer les lignes correspondant à l'article 2 et 4 (0 partout sur les 5 lignes)...

    sachant qu'il y a exactement 5 lignes par article

    et sachant que le fichier sur lequel je travaille contient 700 000 lignes !!

    Merci
    Fichiers attachés Fichiers attachés

  4. #4
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    Vaux-tu imprimer toutes lignes sauf celles dont le deuxième champ vaut zéro ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -lane 'print if $F[1] != 0' ex_article_nombre.txt
    Tu peux obtenir le même résultat avec awk.

  5. #5
    Membre éclairé
    Inscrit en
    Septembre 2006
    Messages
    365
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 365
    Par défaut
    je veux virer les lignes ou Nombre=0 sur toutes les 5 lignes, sachant qu il ya exactement 5 lignes par article

  6. #6
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{if ($2 > 0) print $0}' fichier

  7. #7
    Membre chevronné Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 58

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Par défaut
    As-tu testé les unilignes (celui en perl et la version awk de ripat) ?

    Maintenant si tu ne veux virer les lignes avec 0 uniquement dans le cas où il y en a cinq à la suite l'une de l'autre, c'est aussi faisable (opérateur , en awk et .. en perl).

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