Forum |  HardWare.fr | News | Articles | PC | Prix | S'identifier | S'inscrire | Shop Recherche
789 connectés 

  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Demande d'aide pour utilisation gawk

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Demande d'aide pour utilisation gawk

n°1567958
zedude95
Posté le 31-05-2007 à 14:38:18  profilanswer
 

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

mood
Publicité
Posté le 31-05-2007 à 14:38:18  profilanswer
 

n°1568285
aigles
Posté le 31-05-2007 à 19:22:26  profilanswer
 

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.

n°1568431
zedude95
Posté le 01-06-2007 à 10:32:48  profilanswer
 

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... ;)

n°1568509
aigles
Posté le 01-06-2007 à 11:42:00  profilanswer
 

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.

n°1568584
zedude95
Posté le 01-06-2007 à 13:50:36  profilanswer
 

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 :)

n°1568896
Sve@r
Posté le 02-06-2007 à 06:44:45  profilanswer
 

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.
n°1569076
zedude95
Posté le 02-06-2007 à 18:48:49  profilanswer
 

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

n°1569133
aigles
Posté le 02-06-2007 à 21:29:29  profilanswer
 

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.

n°1569909
zedude95
Posté le 04-06-2007 à 16:57:56  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Shell/Batch

  Demande d'aide pour utilisation gawk

 

Sujets relatifs
aide remetre a zero une cellule[WORD, ACCESS]Lié des requêtes SQL à l'aide d'une macro sous word
Aide pour une expression régulièreDe l'aide svp
AIDE[SQL] - Demande Infos sur sauvegardes.
besoin d'aide pour creation textbox et label en dynamiqueAide pour la creation d'un fichier .bat
Aide pour comprendre Strrev et donc le concoursProbleme d'utilisation de l'API C de mysql sous linux
Plus de sujets relatifs à : Demande d'aide pour utilisation gawk


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR