[awk] je cherche à faire un truc un peu particulier...

je cherche à faire un truc un peu particulier... [awk] - Shell/Batch - Programmation

Marsh Posté le 05-02-2004 à 17:31:28    

salut
 
je veux parcourir un fichier log
et faire ressortir certaines de ces lignes dans un autre fichier
 
avec grep et awk c'est tout à fait possible et tres simple
 
genre pour un fichier comme celui-ci :

Code :
  1. toto; 321657132141; 678781414;
  2. toto; 567987654878; 987564015;
  3. tutu; 444; 4654654654654;
  4. titi; 44545; 654654;
  5. toto; 897965454544; 654231212;


 
pour avoir les lignes contenant toto ou titi, je fais
 

Code :
  1. grep 'toto|titi' mon-fichier > new-fichier


 
ou  
 

Code :
  1. awk 'BEGIN {FS="; "} ($1 == "toto" || $1 == "titi" ) {print $0}' mon-fichier > new-fichier


 
jusque là tout va bien...
mais je voudrai pousser le truc un peu plus loin...
par exemple, ne pas récupérer une ligne contenant le mot "toto" si la ligne précédente contenait le mot "toto" et a déjà été récupérée...
 
je sais pas si je suis clair..
dans mon exemple, le fichier résultat ressemblerai à ceci :

Code :
  1. toto; 321657132141; 678781414;
  2. titi; 44545; 654654;
  3. toto; 897965454544; 654231212;


 
je m'arrache les cheveux..  
 
je ne sais même pas faire une simple boucle sur chaque ligne du fichier, mettre cette ligne dans une variable, et la comparer à la ligne suivante... ce serai peut-être la solution, mais je ne sais comment faire...
 
un grand merci et toute ma reconnaissance à celui ou celle qui me permettra d'avancer !  :)


Message édité par ouf le 05-02-2004 à 17:42:29
Reply

Marsh Posté le 05-02-2004 à 17:31:28   

Reply

Marsh Posté le 05-02-2004 à 21:45:29    

dans le END (apres le traitement ligne par ligne donc)
tu peux faire un traitement ds un while avec le numero de ligne ($i je crois)
et si le premier champ est identique au precedent c bon...
tu dois pouvoir obtenir le numero total de ligne (comme NF pour number of field)
 
j ai fait du awk y a longtemps mais je pense que comme ca c possible


---------------
*<8OD
Reply

Marsh Posté le 06-02-2004 à 09:44:35    

je te remercie grandement !
je vais fouiller de ce côté là
avec ton aide et une bonne nuit de sommeil ça devrai aller ;)
je vous tiens au courant
merci encore

Reply

Marsh Posté le 06-02-2004 à 09:53:05    

Pourquoi tu fais pas ca en Perl??  
Le jour ou j'ai decouvert Perl, il y a bien longtemps, j'ai definitivement arrete d'ecrire du awk.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 06-02-2004 à 09:59:16    

bin j'ai touché perl qu'une fois pour faire un cgi ya 4 ans...
j'ai pas trop le temps de m'y remettre là
mais c'est quelque chose que j'envisage  
merci gilou

Reply

Marsh Posté le 06-02-2004 à 10:33:39    

Ceci devrait résoudre ton problème :
 


awk -f';' '
$1 == "toto" && ! toto { print $0 ; toto = 1 ; next}
$1 == "titi" { print $0 }
{ toto = 0 }
' mon-fichier > new-fichier



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

Marsh Posté le 06-02-2004 à 10:57:00    

j'y suis presque !  merci aigles

Reply

Marsh Posté le 06-02-2004 à 17:16:47    

merci encore à vous, j'ai bien avancé, surtout grâce à l'idée de aigles
bien sûr ce que j'ai à faire est un poil + complexe que ce que montre mon exemple...
mais j'ai pu m'en sortir  ;)
 
maintenant je n'arrive pas à appeler une fonction plutôt qu'un print, mais on verra ça lundi hein  :)
 
:hello:

Reply

Marsh Posté le 06-02-2004 à 21:47:47    

Juste un petit exemple de fonction :
[fixed]
awk -f';' '
function printToto() {
   print $0
   toto = 1
}  
$1 == "toto" && ! toto { printToto() ; next}  
$1 == "titi" { print $0 }  
{ toto = 0 }  
' mon-fichier > new-fichier


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

Marsh Posté le 09-02-2004 à 17:02:30    

Citation :


merci de m'aider c'est vraiment sympa  
 
 
 
Citation :
 
Juste un petit exemple de fonction :  
awk -f';' '  
function printToto() {  
   print $0  
   toto = 1  
}    
$1 == "toto" && ! toto { printToto() ; next}    
$1 == "titi" { print $0 }    
{ toto = 0 }    
' mon-fichier > new-fichier  
 
 
 
ce que tu me proposes, c'est à peu pres ce que je fais.. sauf qu'au départ ma fonction etait en dehors de awk.. j'aurai besoin dans certain cas de passer plusieurs parametres à la fonction..  
 
ma fonction :  
 
 
Code :
 
  my_function()  
  {  
    echo $0  
    var=`echo $0 | awk '{print substr($0, 93);'`  
      sqlplus -s ${BCONNECT}/${BPWD}@${BINSTANCE} <<! | awk -F\| '$1 ~ /mask/ {print $2}' | read var_2    
      set colsep |  
      select 'mask', toto FROM machin WHERE truc=var;  
      exit  
      !  
    }
 
 
 
sachant que pour ce qui est des tests "toto" && "titi" ! blop  etc, j'ai réussi à faire le awk sur une ligne.. je souhaite donc maintenant traiter mon new_fichier dans un nouveau awk, qui insere en base de données par exemple...  
 
mon awk que j'ai essayé de mettre dans un script.awk :  
 
 
Code :
 
  BEGIN {  
    FS="; "  
  }  
  my_function()  
  {  
    echo $0  
    var=`echo $0 | awk '{print substr($0, 93);'`  
      sqlplus -s ${BCONNECT}/${BPWD}@${BINSTANCE} <<! | awk -F\| '$1 ~ /mask/ {print $2}' | read var_2    
      set colsep |  
      select 'mask', toto FROM machin WHERE truc=var;  
      exit  
      !  
    }  
    ($3 == "TITI" && $4 == "TOTO" ) {  
      my_function $0  
    }  
    ($3 == "TITI" && $4 == "TUTU" ) {  
      my_function2 $0 $var_2  
    }  
    ($3 == "TATA" && $4 == "TOTO" ) {  
      my_function3 $0 $var_2  
    }  
    ($3 == "TATA" && $4 == "TUTU" ) {  
      my_function4 $0 $var_2 $var_3  
    }
 
 
 
là ça coince à plusieurs endroits...  
 
d'abord  
Code :
 
  var=`echo $0 | awk '{print substr($0, 93);'`
 
 
 
 syntax error The source line is x.  
 The error context is  
                 >>> var=` <<<  
 awk: The statement cannot be correctly parsed.  
 The source line is x.  
 
puis  sqlplus -s ${BCONNECT}/${BPWD}@${BINSTANCE} <<! | awk -F\| '$1 ~ /mask/ {print $2}' | read var_2  
 
syntax error The source line is xx.  
 The error context is  
                sqlplus -s >>>  ${ <<< BCONNECT}/${BPWD}@${BINSTANCE} <<! | awk -F\| '$1 ~ /mask/ {print $2}' | read var_2  
 awk: The statement cannot be correctly parsed.  
 The source line is xx. (pareil en enlevant les accolades autour de mes variables BCONNECT etc..  
 
bref ce que je cherche à faire est un peu "osé"   lol  
 
mettre du awk dans un awk je sais pas si c possible... je pense pas d'ailleurs...  
de même pour ces connexions à la base de données qui fonctionnent parfaitement dans des fonctions qd celles-ci sont simplement dans le script .sh  
 
oulàlà je galère...  


 
Attention tu es en train de mélanger 'awk' et 'shell'.
Tu ne peux pas intégrer une fonction shell dans un script awk.
 
Le plus simple est de rester au niveau shell, par exemple:

Code :
  1. my_function() {
  2. . . .
  3. }
  4. awk -F';' '
  5. $1== "toto" && ! toto { print $0 ; toto = 1 ; next}
  6. $1 == "titi" { print $0 }
  7. { toto = 0 }
  8. ' mon-fichier | \
  9. while read record
  10.    IFS=';' set $record "" # set $1 $2 .. to field 1 2 ...
  11.    if    [ "$3" = "titi" -a $4 = "toto" ]
  12.    then
  13.       my_function $record
  14.    elsif [ "$3" = "titi" -a "$4" = "tutu" ]
  15.    then
  16.        . . . .
  17.    fi
  18. done


 
Si tu veux rester dans awk, tu dois mettre le code de ta fonction dans un fichier à part 'my_function.sh' par exemple, et tu y fais appel depuis awk par la fonction 'system'.


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

Marsh Posté le 09-02-2004 à 17:02:30   

Reply

Marsh Posté le 09-02-2004 à 23:39:27    

merci jean pierre t'es formidable  :)

Reply

Sujets relatifs:

Leave a Replay

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