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   -
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,
A voir également:

28 réponses

lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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
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

0
artagon7 Messages postés 417 Date d'inscription   Statut Membre Dernière intervention   7
 
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
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
J'ai pensé à changer l'ordre de tri, mais comme je suis paresseux je me suis dit que peut être ça marche avec reverse :-)
0
artagon7 Messages postés 417 Date d'inscription   Statut Membre Dernière intervention   7
 
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, :-))
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
Salut,

No problem ;-)

Bon courage ;-))
0
artagon7 Messages postés 417 Date d'inscription   Statut Membre Dernière intervention   7
 
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
0
lami20j Messages postés 21331 Date d'inscription   Statut Modérateur, Contributeur sécurité Dernière intervention   3 570
 
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 ;-)

0
artagon7 Messages postés 417 Date d'inscription   Statut Membre Dernière intervention   7
 
Salut lami20j,

Non, c'est vrai que tu n'est pas seul sur CCM mais ce n'est pas tout le monde qui connait Perl.

Donc, on se revoit de l'autre côté sous la discussion Apprentissage de Perl. :-)
0