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

Applications et environnements graphiques Discussion :

comment trier un fichier d'après un ordre fourni par un autre fichier


Sujet :

Applications et environnements graphiques

  1. #1
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut comment trier un fichier d'après un ordre fourni par un autre fichier
    Bonjour,

    J'ai un fichier qui me donne l'ordre de mes clés:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ cat cles.txt
    UN
    DEUX
    TROIS
    QUATRE
    CINQ
    J'ai un fichier à trier contenant une liste d'associations clé-valeur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ cat file.txt
    CINQ pas_du_tout
    TROIS passionnement
    DEUX beaucoup
    QUATRE a_la_folie
    UN un_peu
    Je voudrais trier ce fichier dans l'ordre des clés du fichier de clés pour obtenir:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ tri-selon cles.txt file.txt 
    UN un_peu
    DEUX beaucoup
    TROIS passionnement
    QUATRE a_la_folie
    CINQ pas_du_tout
    Connaissez-vous une commande qui fasse ça?

    Sinon, je peux toujours faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ for cle in $(cat cles.txt); do egrep "^$cle " file.txt; done
    mais c'est un peu en O(n*n)

    ou bien bidouiller un truc du genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    cat file.txt \
      | while read cle valeur ; do
        eval $cle=$valeur
        done
     
    for cle in $(cat cles.txt); do
      eval echo $cle \$$cle
    done
    mais ça devient un peu plus compliqué si file.txt contient plusieurs colonnes...

    Votre avis?

    Merci d'avance

    )jack(

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while read cle
    do while read line
       do [ "${line% *}" = "$cle" ] && echo "$line"
       done <file.txt
    done <cles.txt
    c'est sûrement plus rapide en awk !
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while read cle
    do while read line
       do [ "${line% *}" = "$cle" ] && echo "$line"
       done <file.txt
    done <cles.txt
    c'est sûrement plus rapide en awk !
    Bonjour et merci d'avoir répondu.

    Comme j'ai des comparaisons à faire au cours de l'évolution du fichier, je vais m'inspirer de ma dernière proposition

    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
    21
    22
    23
     
    cles=$(cat cles.txt)
     
    while true ; do
      cat file.txt \
        | while read cle valeur ; do
          eval ${cle}_new=$valeur
          done
     
      for cle in cles; do
         eval compare \$${cle}_old \$${cle}_new
      done
     
      for cle in cles; do
        eval echo $cle \$${cle}_new
      done
     
      for cle in cles; do
         eval ${cle}_old=\$${cle}_new
      done
     
      sleep 1
    done
    merci quand même

    )jack(

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 01/06/2014, 11h17
  2. Réponses: 2
    Dernier message: 31/08/2009, 16h20
  3. Réponses: 7
    Dernier message: 03/10/2007, 17h58
  4. Réponses: 2
    Dernier message: 12/06/2006, 18h18
  5. Comment lire un fichier DB en cours d'utilisation par 1 autr
    Par jbat dans le forum Bases de données
    Réponses: 4
    Dernier message: 12/03/2004, 11h06

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