inverser un fichier pour le lire à l'envers [Ksh] - Shell/Batch - Programmation
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é...
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
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...
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)
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 |
Marsh Posté le 26-09-2006 à 22:43:34
raoulglloq a écrit : Je voudrai lire un fichier à l'envers, de bas en haut. |
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...
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 |
edit : je me demande s'il n'y a pas moyen de faire ça avec vi, aussi
Marsh Posté le 27-09-2006 à 13:51:51
aigles a écrit : Ceci devrait faire l'affaire :
|
Merci, je note ca dans mon carnet de note UNIX
Marsh Posté le 27-09-2006 à 15:11:14
Elmoricq a écrit : |
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...
Marsh Posté le 27-09-2006 à 16:36:26
Mais oui c'est faisable avec vi !
vi a.a >/dev/null <<EOD |
Juste pour le fun, trois autres façons de faire :
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.
Marsh Posté le 27-09-2006 à 16:37:12
chuis trop fort.
Marsh Posté le 27-09-2006 à 16:47:57
perl je savais mais c'est une botte secrète (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é
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.
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.
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...
Marsh Posté le 02-10-2006 à 13:55:56
Zavie a écrit : Mouais, ouvrir les yeux, toussa... |
Ca aide à mieux appréhender les choses...
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?