[Ksh] inverser un fichier pour le lire à l'envers

inverser un fichier pour le lire à l'envers [Ksh] - Shell/Batch - Programmation

Marsh Posté le 26-09-2006 à 12:28:17    

Je voudrai lire un fichier à l'envers, de bas en haut.
 
J'utilise la fonction "while read line" qui ne semble pas le permettre.
Je pensai donc dans un premier temps inverser le fichier.
 
La commande sort possede l'option -r qui permet d'inverser le tri, cependant il effectue un tri alphanumerique en plus de l'inversion, ce que je ne veut pas, je veux juste inverser.
 
Or mon fichier est une log dont chaque ligne commence par "2006", je me demandait donc si il etat possible de restraindre le tri de la commande "sort" au premier caractère ("2" ). Cependant l'option des clé ne permet pas de le permettre: il commence en effet par tri sur le caractere correspondant à la clé, mais il tri ensuite sur le reste.
 
Qqun a t'il une solution?

Reply

Marsh Posté le 26-09-2006 à 12:28:17   

Reply

Marsh Posté le 26-09-2006 à 12:51:20    

Doit y avoir moyen de jouer avec un tail dans une boucle par exemple pour lire à l'envers...Mais il y a probablement plus approprié...[:petrus75]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 26-09-2006 à 13:08:08    

si tu as tac sur ton systeme, c'est gagné.
 
et si tu es joueur, tu peux aussi t'amuser avec rev

Reply

Marsh Posté le 26-09-2006 à 13:31:14    

j'ai pas tac sur AIX, seulement sur Linux.
 
Par contre pour rev ca inverse l'ordre des ligne dans le sens ou les caracteres de droites passent à gauche, mais cela n'inverse pas le fichier lui meme, c'est à dire mettre la premiere ligne à la place de la derniere, ect...

Reply

Marsh Posté le 26-09-2006 à 13:33:58    

oui, je sais que ca n'a rien a voir avec ton problème, mais je suis tombé dessus en cherchant, et ca m'a amusé (me faut pas grand chose en ce moment)

Reply

Marsh Posté le 26-09-2006 à 15:34:14    

Ceci devrait faire l'affaire :

awk '{line[++count]=$0} END {for(i=count;i>0;i--) print line[i]}' infile > outfile


---------------
Jean Pierre.
Reply

Marsh Posté le 26-09-2006 à 22:43:34    

raoulglloq a écrit :

Je voudrai lire un fichier à l'envers, de bas en haut.
 
J'utilise la fonction "while read line" qui ne semble pas le permettre.
Je pensai donc dans un premier temps inverser le fichier.
 
La commande sort possede l'option -r qui permet d'inverser le tri, cependant il effectue un tri alphanumerique en plus de l'inversion, ce que je ne veut pas, je veux juste inverser.
 
Or mon fichier est une log dont chaque ligne commence par "2006", je me demandait donc si il etat possible de restraindre le tri de la commande "sort" au premier caractère ("2" ). Cependant l'option des clé ne permet pas de le permettre: il commence en effet par tri sur le caractere correspondant à la clé, mais il tri ensuite sur le reste.
 
Qqun a t'il une solution?


 
Bon, Aigles a une jolie solution à base de "awk". Je vais donc innover en montrant un truc horrible
1) récupérer le nb de lignes en faisant "wc -l fichier"
2) faire une boucle de i allant "n" à 1 en affichant "head -n $i fichier |tail -1"
Ca marche aussi... :D  


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 26-09-2006 à 23:03:21    

Sve@r a écrit :

Bon, Aigles a une jolie solution à base de "awk". Je vais donc innover en montrant un truc horrible
1) récupérer le nb de lignes en faisant "wc -l fichier"
2) faire une boucle de i allant "n" à 1 en affichant "head -n $i fichier |tail -1"
Ca marche aussi... :D


 [:nico0]
 
 
edit : je me demande s'il n'y a pas moyen de faire ça avec vi, aussi

Message cité 1 fois
Message édité par Elmoricq le 26-09-2006 à 23:04:03
Reply

Marsh Posté le 27-09-2006 à 13:51:51    

aigles a écrit :

Ceci devrait faire l'affaire :

awk '{line[++count]=$0} END {for(i=count;i>0;i--) print line[i]}' infile > outfile



 
Merci, je note ca dans mon carnet de note UNIX

Reply

Marsh Posté le 27-09-2006 à 15:11:14    

Elmoricq a écrit :

[:nico0]
 
 
edit : je me demande s'il n'y a pas moyen de faire ça avec vi, aussi


 
Moi, une fois, j'avais voulu faire un karaoké en shell. C'est à dire un pgm qui prend un fichier texte et affiche chaque ligne et colorise chaque mot un après l'autre.
Pfff, j'ai assez vite abandonné l'idée... [:ddr555]


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 27-09-2006 à 15:11:14   

Reply

Marsh Posté le 27-09-2006 à 16:36:26    

Mais oui c'est faisable avec vi !

vi a.a >/dev/null <<EOD
:g/^/m0
:x
EOD


Juste pour le fun, trois autres façons de faire  :D :

tail -r infile > outfile


perl -e 'print reverse <>' infile > outfile


sed -n '1!G;h:$p' infile > outfile


De toutes les solutions, je pense que c'est celle avec tail que me semble la plus simple.


---------------
Jean Pierre.
Reply

Marsh Posté le 27-09-2006 à 16:37:12    

chuis trop fort.[:kbchris]


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 27-09-2006 à 16:47:57    

perl je savais mais c'est une botte secrète [:dawa] (d'ailleurs "perl -i -e 'print reverse <>' inputfile" splus chouette)
 
tail j'avais oublié l'option -r mais je l'ai déjà utilisée
 
vi j'aurais jamais trouvé
 
et total respect pour la commande sed imbitable.
 
J'suis impressionné [:romf]

Message cité 1 fois
Message édité par Elmoricq le 27-09-2006 à 16:51:14
Reply

Marsh Posté le 28-09-2006 à 00:46:27    

Elmoricq a écrit :

et total respect pour la commande sed imbitable.


C'est parce que c'est une syntaxe issue du grec ancien.[:romf]


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 01-10-2006 à 13:42:32    

Je suis sûr que l'on peut faire ça aussi en sed, mais là de tête je ne vois pas.

Reply

Marsh Posté le 01-10-2006 à 17:45:42    

Zavie a écrit :

Je suis sûr que l'on peut faire ça aussi en sed, mais là de tête je ne vois pas.


T'as qu'à remonter le topic jusqu'à la solution de Aigles et là, tu verras...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 01-10-2006 à 21:26:37    

Mouais, ouvrir les yeux, tout ça...


---------------
Viendez vous battre à Prologin \o/
Reply

Marsh Posté le 02-10-2006 à 13:55:56    

Zavie a écrit :

Mouais, ouvrir les yeux, toussa...


Ca aide à mieux appréhender les choses... [:ddr555]


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed