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 :

Trier les parties d'un fichier indépendamment


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 63
    Par défaut Trier les parties d'un fichier indépendamment
    bonsoir à tous,

    J'ai une question par rapport à la commande sort.
    J'ai un fichier contenant plusieurs blocs de lignes. chaque bloc est séparé d'un autre bloc par un séparateur #############

    ligne1
    ligne2
    ligne3
    ########
    ligne4
    ligne5
    ligne6
    ligne7
    #########
    ..........
    #########
    je voudrais trier chaque bloc de lignes indépendamment des autres blocs. En gros, trier le premier bloc, puis le deuxième bloc et ainsi de suite mais indépendamment. Mais je ne sais pas comment y prendre, la commande sort me trier tout le fichier directement.
    L'idée qui met venue c'est de spliter le fichier en plusieurs sous fichiers suivant le séparateur #:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    csplit -z -f fich fichier.txt "/^#/" {203}
    Puis d'effectuer le trier pour chaque fichier engendré:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     sort -t'|' -k5gr /home/sab/* >res
    mais ça ne me trie pas les fichiers indépendamment.

    Pouvez vous m'aider svp

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 659
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 659
    Par défaut
    Bonjour,

    tu peux mettre ta commande sort dans une boucle for, qui itérera sur les noms des fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for f in /home/sab/*
    do sort -t'|' -k5gr "$f"
    done >res
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    l'essentiel est ici surement que ça fonctionne et le code précédent convient parfaitement, néanmoins personnellement c'est le genre de traitement suffisament complexe pour lequel j'aurais tendance à dégainer autre chose que bash ou même awk
    donc dans l'optique de faire quelque chose de court, -relativement- lisible, tout en ne touchant pas aux données d'entrée (on conserve le fichier sans le spliter), j'aurais tendance à recourir à Perl par exemple :

    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    perl -ne 'if ($_ =~ /^#/) {print sort { $a <=> $b } @tab; @tab=(); print $_; next} {push(@tab,$_)}' fichier
    EDIT: on m'a soufflé une méthode que je trouve assez élégante en awk après coup :
    Code awk : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '/^#/ {close("sort -n"); print; next} {print | "sort -n"}' fichier

  4. #4
    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
    Citation Envoyé par BufferBob Voir le message
    EDIT: on m'a soufflé une méthode que je trouve assez élégante en awk après coup :
    Code awk : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '/^#/ {close("sort -n"); print; next} {print | "sort -n"}' fichier
    C'est effectivement du awk de haut vol. Joli.


  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 63
    Par défaut
    Merci N_BaH, BufferBob et ripat pour vos réponses

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

Discussions similaires

  1. Réponses: 21
    Dernier message: 17/12/2012, 15h38
  2. [XML] Trier les doublons d'un fichier xml
    Par jameson dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 29/11/2010, 10h50
  3. Réponses: 2
    Dernier message: 19/09/2006, 21h34
  4. Réponses: 3
    Dernier message: 26/04/2004, 12h51

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