Reformatage de fichier Unix
Caribou
-
Caribou -
Caribou -
Bonjour,
J'ai un lot de gros fichiers ascii qu j'aimerai traiter de la maniére suivante :
Une des colonnes de ces fichiers, peut importe laquelle ( mettons la $5 pour notre exemple ) contient des nombres entiers qui s'incrémentent à certaines lignes :
$5=
1
1
1
1
1
2
2
2
2
3
3
3
3
3
3
3
3
4
4
[...]
J'aimerai que pour un "bloc", c'est à dire pour toutes les lignes ayant un même nombre, le formatage soit le suivant : 1 pour la première ligne, 2 pour toutes les suivantes et 3 pour la dernière. ( ce que correspond dans le soft à que j'alimenterai avec ce ficher à un poser de crayon, au tracage d'un segment pui à un lever de crayon).
Concrètement, en reprenant l'exemple précédent, ma $5 deviendrai :
$5=
1
2
2
2
3
1
2
2
3
1
2
2
2
2
2
2
3
1
3
[...]
Quand j'ai peu de fichiers et qu'ils font moins de 32000 lignes, sous excel c'est facile. Mais j'aimerai une solution plus élégante qui fonctionne en mettant mon fichier en argument d'entrée et qui me sorte mon fichier reformaté.
Pour ce qui est de la programmation , je m'en sort la plupart du temps avec sed et awk, mais là, étant donné que la valeur d'une ligne va dépendre de la précédente, je galére un peu avec awk, qui lit ligne a ligne.
J'ai essayé en stockant dans une variable la valeur de la ligne i le temps de comparer avec i+1 mais au final y'a toujours quelquechose qui va pas...
Si vous avec des idées, je suis preneur...
Merci d'avance, et n'hésitez pas a me questionner si j'ai pas été très clair.
J'ai un lot de gros fichiers ascii qu j'aimerai traiter de la maniére suivante :
Une des colonnes de ces fichiers, peut importe laquelle ( mettons la $5 pour notre exemple ) contient des nombres entiers qui s'incrémentent à certaines lignes :
$5=
1
1
1
1
1
2
2
2
2
3
3
3
3
3
3
3
3
4
4
[...]
J'aimerai que pour un "bloc", c'est à dire pour toutes les lignes ayant un même nombre, le formatage soit le suivant : 1 pour la première ligne, 2 pour toutes les suivantes et 3 pour la dernière. ( ce que correspond dans le soft à que j'alimenterai avec ce ficher à un poser de crayon, au tracage d'un segment pui à un lever de crayon).
Concrètement, en reprenant l'exemple précédent, ma $5 deviendrai :
$5=
1
2
2
2
3
1
2
2
3
1
2
2
2
2
2
2
3
1
3
[...]
Quand j'ai peu de fichiers et qu'ils font moins de 32000 lignes, sous excel c'est facile. Mais j'aimerai une solution plus élégante qui fonctionne en mettant mon fichier en argument d'entrée et qui me sorte mon fichier reformaté.
Pour ce qui est de la programmation , je m'en sort la plupart du temps avec sed et awk, mais là, étant donné que la valeur d'une ligne va dépendre de la précédente, je galére un peu avec awk, qui lit ligne a ligne.
J'ai essayé en stockant dans une variable la valeur de la ligne i le temps de comparer avec i+1 mais au final y'a toujours quelquechose qui va pas...
Si vous avec des idées, je suis preneur...
Merci d'avance, et n'hésitez pas a me questionner si j'ai pas été très clair.
A voir également:
- Reformatage de fichier Unix
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
- Fichier .dat - Guide
4 réponses
hello
est-ce que ça que tu veux ?
est-ce que ça que tu veux ?
$ cat a3
1
1
1
1
1
2
2
2
2
3
3
3
3
3
3
3
3
4
4
$ awk '{l[NR]=$1};END{for(i=1;i<=NR;i++){if(l[i]!=l[i-1])print "1";if(l[i]==l[i-1] && l[i]==l[i+1])print "2";if(l[i]!=l[i+1])print "3"}}' < a3
1
2
2
2
3
1
2
2
3
1
2
2
2
2
2
2
3
1
3
Hello Dubcek,
merci d'avoir répondu.. :)
Sur ce que tu montres, la transformation du fichier a3 est exactement ce que j'attends... mais ca tourne pas chez moi...
Il m'indique "Syntax Error" au niveau du END. et si je le zappe, le fichier obtenu n'est pas du tout ce que j'attends..
des idées ? ou peut-etre un probléme avec mon shell ?
merci d'avoir répondu.. :)
Sur ce que tu montres, la transformation du fichier a3 est exactement ce que j'attends... mais ca tourne pas chez moi...
Il m'indique "Syntax Error" au niveau du END. et si je le zappe, le fichier obtenu n'est pas du tout ce que j'attends..
des idées ? ou peut-etre un probléme avec mon shell ?
quel unix ?
essaye nawk
il y a le bon nombre de {} ' ' () ?
si c'est awk sous windows, probablement un problème de guillemets, tu peux metttre le code dans un fichier sans les '
$ cat fichier.awk
{l[NR]=$1};END{for(i=1;i<=NR;i++){if(l[i]!=l[i-1])print "1";if(l[i]==l[i-1] && l[i]==l[i+1])print "2";if(l[i]!=l[i+1])print "3"}}
et exécuter avec
$ awk -f fichier.awk < fichierdonnées
essaye nawk
il y a le bon nombre de {} ' ' () ?
si c'est awk sous windows, probablement un problème de guillemets, tu peux metttre le code dans un fichier sans les '
$ cat fichier.awk
{l[NR]=$1};END{for(i=1;i<=NR;i++){if(l[i]!=l[i-1])print "1";if(l[i]==l[i-1] && l[i]==l[i+1])print "2";if(l[i]!=l[i+1])print "3"}}
et exécuter avec
$ awk -f fichier.awk < fichierdonnées
Haaaaa...
Et bien merci Dubcek... la ligne awk de ton premier post fonctionne parfaitement... du boulot..
Hier 11 novembre j'ai testé de chez moi, machine windows emulée Cygwin et ca ne fonctionnait pas...
Ici, depuis Exceed (et également sur les machines linux) ca tourne..
Tu m'enléve une épine du pied..
Merci et bonne continuation.
Caribou.
Et bien merci Dubcek... la ligne awk de ton premier post fonctionne parfaitement... du boulot..
Hier 11 novembre j'ai testé de chez moi, machine windows emulée Cygwin et ca ne fonctionnait pas...
Ici, depuis Exceed (et également sur les machines linux) ca tourne..
Tu m'enléve une épine du pied..
Merci et bonne continuation.
Caribou.