Demande d'aide pour utilisation gawk

Demande d'aide pour utilisation gawk - Shell/Batch - Programmation

Marsh Posté le 31-05-2007 à 14:38:18    

Si quelqu'un peut m'aider, ce serait vraiment sympa
Je commence tout juste à vouloir utiliser gawk et comme cela fait bien trop longtemps que je ne fais plus de programmation, je crois que je suis un peu perdu...
Aussi vais-je montrer ce que je souhaite obtenir et si quelqu'un peut m'aider, eh bien je lui en serais très reconnaissant.
 
Donc voilà. En entrée j'ai le fichier suivant (les lignes === ne font pas partie du fichier mais permettent de montrer où commencent et où s'arrêtent les datas)
 
=======
 
Title 1
 
réservé le 24/05/2007  
-  
-  
oui  
4,99 €  
 
 
 
 
--------------------------------------------------------------------------------
 
Title 2
 
réservé le 16/05/2007  
-  
-  
oui  
 
 
 
 
 
--------------------------------------------------------------------------------
 
Title 3
 
réservé le 15/05/2007  
-  
-  
oui  
17,98 €  
 
 
 
 
--------------------------------------------------------------------------------
 
Title 4
 
réservé le 15/05/2007  
-  
-  
oui  
15,80 €  
 
 
 
 
--------------------------------------------------------------------------------
 
Title 5
 
réservé le 15/05/2007  
-  
-  
oui  
15,50 €  
 
 
 
 
--------------------------------------------------------------------------------
 
Title 6
 
réservé le 15/05/2007  
-  
-  
oui  
49,50 €  
 
 
 
 
--------------------------------------------------------------------------------
 
Title 7
 
réservé le 15/05/2007  
-  
-  
oui  
 
 
 
 
 
--------------------------------------------------------------------------------
=======
 
je voudrais après traitement obtenir le fichier suivant :
 
Title 1; 4,99 €
Title 2;
Title 3; 17,98 €
Title 4; 15,80 €
Title 5; 15,50 €
Title 6; 49,50 €
Title 7;
 
Il s'agit donc de considérer que la liste du début est une suite de records dont chaque ligne est un champs, soit un total de 13 champs (le dernier étant une suite de -----) et que je veux extraire le 2ème champs (le nom) et le 8ème champs (un prix) le tout concaténé en une seule ligne avec un séparateur ;
 
Voilà l'idée
Ne reste plus à ce qu'une bonne âme m'explique comment y parvenir
 
Encore merci d'avance

Reply

Marsh Posté le 31-05-2007 à 14:38:18   

Reply

Marsh Posté le 31-05-2007 à 19:22:26    

Le petit programme awk suivant devrait faire l'affaire :

BEGIN {
   OFS = ";";
}
function print_datas() {
   if (f) print field[2],field[8];
   for (f in field) field[f] = "";
   f = 0;
}
/^-+$/ {  
   print_datas();
   next
}
{
   field[++f] = $0
}


 
 
Jean-Pierre.

Reply

Marsh Posté le 01-06-2007 à 10:32:48    

Ca marche du feu de dieu
Merci beaucoup
 
Ne me reste plus qu'à tenter d'y comprendre quelque chose (et ça c'est pas gagné) si je dois l'adapter à un fichier légèrement différent dans le futur... ;)

Reply

Marsh Posté le 01-06-2007 à 11:42:00    

zedude95 a écrit :

Ca marche du feu de dieu
Merci beaucoup
 
Ne me reste plus qu'à tenter d'y comprendre quelque chose (et ça c'est pas gagné) si je dois l'adapter à un fichier légèrement différent dans le futur... ;)


{  
   field[++f] = $0  
}

Chaque ligne du fichier correspond à un champ de l'enregistrement logique qui se termine par une suite de '-').
La variable f (initialisée à 0 par awk) contient le numéro du dernier champ rencontré.
La ligne lue est mémorisée dans le tableau field avec pour indice ++f (on incrémente f avant utilisation).  
 

/^-+$/ {  
   print_datas();  
   next  
}

Lorsque l'on recontre la fin de l'enregistrement logique logique (ligne ne comportant qu'une suite de '-'), les données mémorisées sont affichées par la fonction print_datas et l'on passe à la lecture de la ligne suivante.
 

function print_datas() {  
   if (f) print field[2],field[8];  
   for (f in field) field[f] = "";  
   f = 0;  
}

La fonction print_datas affiche les champs 2 et 8 de l'enregistrement logique si au moins un champ a été trouvé ( if (f) est la même chose que if (f>0) )
Le séparateur de champs pour l'affichage est ';', il modifié dans la pattern BEGIN.
Les champs mémorisés sont vidés, et le numéro du dernier champ rencontré est re-initialisé à 0.
 
 
En espérant que ces quelques explications te seront utiles.
 
Jean-Pierre.

Reply

Marsh Posté le 01-06-2007 à 13:50:36    

Je crois que j'ai tout compris
 
Par contre je risque d'avoir un autre fichier qui n'a pas de "délimiteur" comme les ---  indiquant une fin d'enregistrement logique
Dès lors je risque d'avoir à faire un simple comptage pour dire, je prends les lignes X et Y et rendu à 15 par exemple, je redémarre le compteur de champs logique à 0
 
Pas sûr que j'y arrive du premier coup mais bon.... no pain no game :)

Reply

Marsh Posté le 02-06-2007 à 06:44:45    

zedude95 a écrit :

Je crois que j'ai tout compris
 
Par contre je risque d'avoir un autre fichier qui n'a pas de "délimiteur" comme les ---  indiquant une fin d'enregistrement logique
Dès lors je risque d'avoir à faire un simple comptage pour dire, je prends les lignes X et Y et rendu à 15 par exemple, je redémarre le compteur de champs logique à 0
 
Pas sûr que j'y arrive du premier coup mais bon.... no pain no game :)


La variable "NR" de awk t'indique à quelle ligne tu te trouves...


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

Marsh Posté le 02-06-2007 à 18:48:49    

Et toi pour savoir si les lignes que awk lit son celles que tu souhaites garder, tu utiliserais une fonction module ou autre chose ?

Reply

Marsh Posté le 02-06-2007 à 21:29:29    

zedude95 a écrit :

Et toi pour savoir si les lignes que awk lit son celles que tu souhaites garder, tu utiliserais une fonction module ou autre chose ?


Modulo est effectivement une solution.
Le cas précédent aurait tout aussi bien put s'écrire :

BEGIN {
   OFS = ";";
   record_size = 13;
}
function print_datas() {
   print field[2],field[8];
   for (f in field) field[f]="";
}
NR%record_size == 0 {
   print_datas();
   next
}
{
   field[NR%record_size] = $0
}


 
Jean-Pierre.

Reply

Marsh Posté le 04-06-2007 à 16:57:56    

Oui effectivement ca marche aussi. C'est d'ailleurs la solution la mieux adaptée quand on n'a pas de délimiteur mais que les records sont fixes
 
Merci

Reply

Sujets relatifs:

Leave a Replay

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