Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications
Applications Questions sur l'utilisation d'applications, du shell, et des interfaces graphiques (KDE, Gnome, XFCE... )
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/03/2011, 15h44   #1
Membre confirmé
 
Inscription : avril 2008
Messages : 187
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 187
Points : 221
Points : 221
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 :
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 :
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 :
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 :
$ 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 :
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(
jack-ft est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 17/03/2011, 18h48   #2
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
Bonjour,

Code :
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_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 18/03/2011, 13h37   #3
Membre confirmé
 
Inscription : avril 2008
Messages : 187
Détails du profil
Informations forums :
Inscription : avril 2008
Messages : 187
Points : 221
Points : 221
Citation:
Envoyé par N_BaH Voir le message
Bonjour,

Code :
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 :
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(
jack-ft est déconnecté   Envoyer un message privé Réponse avec citation 01
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 19h29.


 
 
 
 
Partenaires

Hébergement Web