Tri des lignes d'un fichier
Résolu
artagon7
Messages postés
417
Date d'inscription
Statut
Membre
Dernière intervention
-
artagon7 Messages postés 417 Date d'inscription Statut Membre Dernière intervention -
artagon7 Messages postés 417 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je voudrais savoir s'il est possible avec sed (ou awk ou sort) de trier un fichier (selon divers critères de tri) contenant plusieurs lignes représentant chacune un fichier.
Par exemple, prenons le fichier cosmos.txt (obtenu avec ls -gGt) qui contient les lignes suivantes :
total 31664
-rwxrwx--- 1 53460 2007-10-07 02:29 600px-V838_Mon_HST[600x600]1999.jpg
-rwxrwx--- 1 69991 2007-10-07 02:27 739px-Omega_Nebula[739x600]1996.jpg
-rwxrwx--- 1 37021 2007-10-07 02:26 NGC2080[600x601]1998.jpg
-rwxrwx--- 1 138525 2007-10-07 02:25 603px-Crab_Nebula[603x600]1997.jpg
-rwxrwx--- 1 525752 2007-10-07 02:24 ESO97-13[1280x1280]1999.jpg
-rwxrwx--- 1 88098 2007-10-07 02:24 600px-ESO97-13[600x601]1999.jpg
Premierement, il faudrait eliminer la premiere ligne (total 31664). Ca devrait pas poser de problemes avec : sed '1d'
Dans mon fichier, j'ai 6 champs.
Je voudrais trier mon fichier selon le sixieme champ, soit le nom des fichiers.
De plus, je voudrais que le premier critère de tri soit le premier nombre (plus petit) associé à la résolution (compris entre [ et x ).
Le deuxième critère serait ensuite le second nombre associé à la résolution (compris entre x et ] ).
Mon dernier critère serait ensuite l'année (compris entre ] et . ).
Le résultat final désiré est le suivant :
-rwxrwx--- 1 53460 2007-10-07 02:29 600px-V838_Mon_HST[600x600]1999.jpg
-rwxrwx--- 1 37021 2007-10-07 02:26 NGC2080[600x601]1998.jpg
-rwxrwx--- 1 88098 2007-10-07 02:24 600px-ESO97-13[600x601]1999.jpg
-rwxrwx--- 1 138525 2007-10-07 02:25 603px-Crab_Nebula[603x600]1997.jpg
-rwxrwx--- 1 69991 2007-10-07 02:27 739px-Omega_Nebula[739x600]1996.jpg
-rwxrwx--- 1 525752 2007-10-07 02:24 ESO97-13[1280x1280]1999.jpg
C'est ca mon petit probleme ... Ca me serait tres utile de trier mes fichiers selon les criteres de mon choix. Ici, j'en ai mis trois. Mais ca pourrait etre deux, cinq, etc...
Merci beaucoup,
Je voudrais savoir s'il est possible avec sed (ou awk ou sort) de trier un fichier (selon divers critères de tri) contenant plusieurs lignes représentant chacune un fichier.
Par exemple, prenons le fichier cosmos.txt (obtenu avec ls -gGt) qui contient les lignes suivantes :
total 31664
-rwxrwx--- 1 53460 2007-10-07 02:29 600px-V838_Mon_HST[600x600]1999.jpg
-rwxrwx--- 1 69991 2007-10-07 02:27 739px-Omega_Nebula[739x600]1996.jpg
-rwxrwx--- 1 37021 2007-10-07 02:26 NGC2080[600x601]1998.jpg
-rwxrwx--- 1 138525 2007-10-07 02:25 603px-Crab_Nebula[603x600]1997.jpg
-rwxrwx--- 1 525752 2007-10-07 02:24 ESO97-13[1280x1280]1999.jpg
-rwxrwx--- 1 88098 2007-10-07 02:24 600px-ESO97-13[600x601]1999.jpg
Premierement, il faudrait eliminer la premiere ligne (total 31664). Ca devrait pas poser de problemes avec : sed '1d'
Dans mon fichier, j'ai 6 champs.
Je voudrais trier mon fichier selon le sixieme champ, soit le nom des fichiers.
De plus, je voudrais que le premier critère de tri soit le premier nombre (plus petit) associé à la résolution (compris entre [ et x ).
Le deuxième critère serait ensuite le second nombre associé à la résolution (compris entre x et ] ).
Mon dernier critère serait ensuite l'année (compris entre ] et . ).
Le résultat final désiré est le suivant :
-rwxrwx--- 1 53460 2007-10-07 02:29 600px-V838_Mon_HST[600x600]1999.jpg
-rwxrwx--- 1 37021 2007-10-07 02:26 NGC2080[600x601]1998.jpg
-rwxrwx--- 1 88098 2007-10-07 02:24 600px-ESO97-13[600x601]1999.jpg
-rwxrwx--- 1 138525 2007-10-07 02:25 603px-Crab_Nebula[603x600]1997.jpg
-rwxrwx--- 1 69991 2007-10-07 02:27 739px-Omega_Nebula[739x600]1996.jpg
-rwxrwx--- 1 525752 2007-10-07 02:24 ESO97-13[1280x1280]1999.jpg
C'est ca mon petit probleme ... Ca me serait tres utile de trier mes fichiers selon les criteres de mon choix. Ici, j'en ai mis trois. Mais ca pourrait etre deux, cinq, etc...
Merci beaucoup,
A voir également:
- Tri des lignes d'un fichier
- Fichier bin - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
- Fichier rar - Guide
- Fichier .dat - Guide
28 réponses
Non, toujours le meme resultat.
bizarre
J'ai fait print $_ mais ca n'affiche rien.
je t'ai dit que $_ c'est un tableau (enfin une référence vers un tableau anonyme)
si on a un ttable tab en perl on l'appelle @tab
alors si on a un tableau $_ , on l'appelle comment ?!
1 on voit qu'il s'agit de tableau
bizarre
J'ai fait print $_ mais ca n'affiche rien.
je t'ai dit que $_ c'est un tableau (enfin une référence vers un tableau anonyme)
si on a un ttable tab en perl on l'appelle @tab
alors si on a un tableau $_ , on l'appelle comment ?!
1 on voit qu'il s'agit de tableau
lami20j@debian:~/trash$ cat ccm.pl #!/usr/bin/perl while(<DATA>){ /.*:\d+\s+(.*)\[(\d+)x(\d+)\](\d{4})\..*/; chomp; push @nontrie,[$_,$2,$3,$4]; } print "$_\n" for @nontrie; __END__ -rwxrwx--- 1 53460 2007-10-07 02:29 600px-V838_Mon_HST[600x600]1999.jpg -rwxrwx--- 1 69991 2007-10-07 02:27 739px-Omega_Nebula[739x600]1996.jpg -rwxrwx--- 1 37021 2007-10-07 02:26 NGC2080[600x601]1998.jpg -rwxrwx--- 1 138525 2007-10-07 02:25 603px-Crab_Nebula[603x600]1997.jpg -rwxrwx--- 1 525752 2007-10-07 02:24 ESO97-13[1280x1280]1999.jpg -rwxrwx--- 1 88098 2007-10-07 02:24 600px-ESO97-13[600x601]1999.jpg lami20j@debian:~/trash$ perl ccm.pl ARRAY(0x814ec28) ARRAY(0x814f72c) ARRAY(0x814f774) ARRAY(0x814f7bc) ARRAY(0x814f804) ARRAY(0x814f84c)2 on affiche le tableau référencé par $_
lami20j@debian:~/trash$ cat ccm.pl #!/usr/bin/perl while(<DATA>){ /.*:\d+\s+(.*)\[(\d+)x(\d+)\](\d{4})\..*/; chomp; push @nontrie,[$_,$2,$3,$4]; } print "@$_\n" for @nontrie; __END__ -rwxrwx--- 1 53460 2007-10-07 02:29 600px-V838_Mon_HST[600x600]1999.jpg -rwxrwx--- 1 69991 2007-10-07 02:27 739px-Omega_Nebula[739x600]1996.jpg -rwxrwx--- 1 37021 2007-10-07 02:26 NGC2080[600x601]1998.jpg -rwxrwx--- 1 138525 2007-10-07 02:25 603px-Crab_Nebula[603x600]1997.jpg -rwxrwx--- 1 525752 2007-10-07 02:24 ESO97-13[1280x1280]1999.jpg -rwxrwx--- 1 88098 2007-10-07 02:24 600px-ESO97-13[600x601]1999.jpg lami20j@debian:~/trash$ perl ccm.pl -rwxrwx--- 1 53460 2007-10-07 02:29 600px-V838_Mon_HST[600x600]1999.jpg 600 600 1999 -rwxrwx--- 1 69991 2007-10-07 02:27 739px-Omega_Nebula[739x600]1996.jpg 739 600 1996 -rwxrwx--- 1 37021 2007-10-07 02:26 NGC2080[600x601]1998.jpg 600 601 1998 -rwxrwx--- 1 138525 2007-10-07 02:25 603px-Crab_Nebula[603x600]1997.jpg 603 600 1997 -rwxrwx--- 1 525752 2007-10-07 02:24 ESO97-13[1280x1280]1999.jpg 1280 1280 1999 -rwxrwx--- 1 88098 2007-10-07 02:24 600px-ESO97-13[600x601]1999.jpg 600 601 1999
lami20j,
Il s'agit simplement d'enlever premierement le mot reverse. Deuxiemement, j'ai lu dans perlfunc par rapport a la commande sort que pour inverser le tri on doit inverser $a et $b. C'est que j'ai fait.
Donc, le script qui fonctionne en ligne de commande est le suivant :
#!/usr/bin/perl
while(<>){
/.*:\d+\s+(.*)\[(\d+)x(\d+)\](\d{4})\..*/;
chomp;
push @nontrie,[$_,$2,$3,$4];
}
@trie = map {$_->[0]}
sort {
$b->[1] <=> $a->[1]
||
$b->[2] <=> $a->[2]
||
$b->[3] <=> $a->[3]
}
map { $_ } @nontrie;
print "$_\n" for @trie;
Je comprend maintenant que la commande ls -gG donne le premier champ. Je croyais que ca donnait en tout 6 champs. Je comprend mieux la facon dont tu procedes maintenant.
Merci encore
Il s'agit simplement d'enlever premierement le mot reverse. Deuxiemement, j'ai lu dans perlfunc par rapport a la commande sort que pour inverser le tri on doit inverser $a et $b. C'est que j'ai fait.
Donc, le script qui fonctionne en ligne de commande est le suivant :
#!/usr/bin/perl
while(<>){
/.*:\d+\s+(.*)\[(\d+)x(\d+)\](\d{4})\..*/;
chomp;
push @nontrie,[$_,$2,$3,$4];
}
@trie = map {$_->[0]}
sort {
$b->[1] <=> $a->[1]
||
$b->[2] <=> $a->[2]
||
$b->[3] <=> $a->[3]
}
map { $_ } @nontrie;
print "$_\n" for @trie;
Je comprend maintenant que la commande ls -gG donne le premier champ. Je croyais que ca donnait en tout 6 champs. Je comprend mieux la facon dont tu procedes maintenant.
Merci encore
J'ai pensé à changer l'ordre de tri, mais comme je suis paresseux je me suis dit que peut être ça marche avec reverse :-)
Salut lami20j,
Je vais étudier ton dernier script cette semaine. Je me suis rendu compte finalement que pour écrire les scripts que je voulais faire, je dois surtout maitriser les expressions régulières. Je vais donc lire le document PERLRETUT qui semble, à première vue, une très bonne référence. Ca devrait etre plus facile pour moi par la suite.
Je vais donc poser le problème comme résolu mais je reviendrai surement avec d'autres questions sur ton script.
Donc, merci et à la prochaine, :-))
Je vais étudier ton dernier script cette semaine. Je me suis rendu compte finalement que pour écrire les scripts que je voulais faire, je dois surtout maitriser les expressions régulières. Je vais donc lire le document PERLRETUT qui semble, à première vue, une très bonne référence. Ca devrait etre plus facile pour moi par la suite.
Je vais donc poser le problème comme résolu mais je reviendrai surement avec d'autres questions sur ton script.
Donc, merci et à la prochaine, :-))
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour lami20j,
Etant donne que tu as resolu le probleme de cette discussion, j'aimerais le clore et passer a une autre discussion sur Perl mais cette fois-ci dans le forum Programmation. Je crois que ce serait plus approprie. Si tu ne le frequentes pas, je vais ouvrir la discussion ici, dans le forum Linux/Unix.
Apres avoir lu les pages man de PERLRETUT, je comprends beaucoup mieux ton script qui semble tres clair. Donc, je croyais etre en mesure d'ecrire moi-meme un script tres semblable au tien mais je n'ai pas reussi. Je croyais que c'etait dans le sac mais ce n'est pas encore le cas. Il faut croire que je dois encore etudier...
Salut
Etant donne que tu as resolu le probleme de cette discussion, j'aimerais le clore et passer a une autre discussion sur Perl mais cette fois-ci dans le forum Programmation. Je crois que ce serait plus approprie. Si tu ne le frequentes pas, je vais ouvrir la discussion ici, dans le forum Linux/Unix.
Apres avoir lu les pages man de PERLRETUT, je comprends beaucoup mieux ton script qui semble tres clair. Donc, je croyais etre en mesure d'ecrire moi-meme un script tres semblable au tien mais je n'ai pas reussi. Je croyais que c'etait dans le sac mais ce n'est pas encore le cas. Il faut croire que je dois encore etudier...
Salut
Salut,
passer a une autre discussion sur Perl mais cette fois-ci dans le forum Programmation. Je crois que ce serait plus approprie.
Oui en effet.
Si tu ne le frequentes pas, je vais ouvrir la discussion ici, dans le forum Linux/Unix.
Il n'y a pas que moi sur CCM ;-), toutefois je ne loupe pas une discussion sur Perl ;-)
passer a une autre discussion sur Perl mais cette fois-ci dans le forum Programmation. Je crois que ce serait plus approprie.
Oui en effet.
Si tu ne le frequentes pas, je vais ouvrir la discussion ici, dans le forum Linux/Unix.
Il n'y a pas que moi sur CCM ;-), toutefois je ne loupe pas une discussion sur Perl ;-)