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

  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 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 éprouvé
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    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.
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  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
    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 confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    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 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 veux virer les lignes ou Nombre=0 sur toutes les 5 lignes, sachant qu il ya exactement 5 lignes par article

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{if ($2 > 0) print $0}' fichier
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

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

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    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).

  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
    ce que je fais marche, mais avec des problèmes de performances manifestes !!

    Je ne sais pas faire autrement, et je suis pas du tout familier avec Perl.. je connais un peu awk mais je ne vois pas comment ameliorer ce que je fais...

  9. #9
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par freestyler Voir le message
    ce que je fais marche, mais avec des problèmes de performances manifestes !!
    Si c'est vraiment si gourmand, tu es mieux de passer par un programme C.

  10. #10
    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 pour le tuyau..
    mais je DOIS m'en tenir au scripting..

    et puis je suis au bon forum, non?

  11. #11
    Inactif  
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    1 958
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 1 958
    Points : 2 467
    Points
    2 467
    Par défaut
    Citation Envoyé par freestyler Voir le message
    merci pour le tuyau..
    mais je DOIS m'en tenir au scripting..

    et puis je suis au bon forum, non?
    Oui oui bien sûr, tu es sur le bon forum.

    Mais comment ça « tu dois » ?!
    C'est un exercice de cours ?

  12. #12
    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
    non
    je suis sur une plateforme client, et je dois faire ceci par un script ..

  13. #13
    Membre confirmé Avatar de iblis
    Inscrit en
    Janvier 2007
    Messages
    510
    Détails du profil
    Informations personnelles :
    Âge : 57

    Informations forums :
    Inscription : Janvier 2007
    Messages : 510
    Points : 570
    Points
    570
    Par défaut
    ce que je fais marche, mais avec des problèmes de performances manifestes !!
    Si les unilignes ci-dessus marchent, ils ne devraient avoir aucun problème à traiter 700000 lignes (ou alors tes accès disque sont sacrément lent ). Que fais-tu d'autre?

  14. #14
    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
    deja pour un fichier a 20 lignes, ca pose un probleme...
    alors pour 700 000 lignes, tu imagines

    en fait je dois parcourrir le fichier (700 000/5) fois !

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

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Points : 1 206
    Points
    1 206
    Par défaut
    As-tu vraiment essayé les one-liners donnés plus haut?

    Je viens de faire un traitement similaire sur un fichier de plus d'un million de lignes et ça prend quelques secondes tout au plus.
    :q :q! :wq :w :w! :wq! :quit :quit! :help help helpquit quit quithelp
    :quitplease :quitnow :leave :shit ^X^C ^C ^D ^Z ^Q QUITDAMMIT
    Jabber: ripat at im.apinc.org

  16. #16
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 119
    Points
    28 119
    Par défaut
    Bonjour,

    Pourquoi ne pas utiliser le résultat de sort -u (trie le fichier en ne laissant que les lignes uniques) ?

    Un genre d'algo comme ca :

    sort -u fichier > liste_unique

    lister les lignes dont le second membre est 0, et regarder si la liste_unique contient d'autres valeurs pour le même premier membre
    Si oui, alors les 5 lignes ne sont pas à 0 -> ne rien faire
    Si non, alors les 5 lignes sont à 0, donc suppression des lignes pour le même premier membre
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

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