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

  FORUM HardWare.fr
  Programmation
  Shell/Batch

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°632460
ouf
Posté le 05-02-2004 à 17:31:28  profilanswer
 

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
mood
Publicité
Posté le 05-02-2004 à 17:31:28  profilanswer
 

n°632754
bonzefou
Posté le 05-02-2004 à 21:45:29  profilanswer
 

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
n°633094
ouf
Posté le 06-02-2004 à 09:44:35  profilanswer
 

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

n°633104
gilou
Modérateur
Modzilla
Posté le 06-02-2004 à 09:53:05  profilanswer
 

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é!  --
n°633111
ouf
Posté le 06-02-2004 à 09:59:16  profilanswer
 

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

n°633156
aigles
Posté le 06-02-2004 à 10:33:39  profilanswer
 

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.
n°633205
ouf
Posté le 06-02-2004 à 10:57:00  profilanswer
 

j'y suis presque !  merci aigles

n°633750
ouf
Posté le 06-02-2004 à 17:16:47  profilanswer
 

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:

n°633960
aigles
Posté le 06-02-2004 à 21:47:47  profilanswer
 

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.
n°636215
aigles
Posté le 09-02-2004 à 17:02:30  profilanswer
 

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.
mood
Publicité
Posté le 09-02-2004 à 17:02:30  profilanswer
 

n°636621
ouf
Posté le 09-02-2004 à 23:39:27  profilanswer
 

merci jean pierre t'es formidable  :)


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

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

 

Sujets relatifs
[MySQL] cherche doc ou tuto sur les DATE et TIMEJe cherche un programme de capture d'image
[Java] Pour apprendre, je cherche un livre d'exemplesC et C++ : y a un truc dont vous aimeriez parler ?
cherche analyseur de log !Truc tout con
Truc tout bête listes les fichiers d'un dossierCherche script qui affiche l'espace serveur restant
Cherche un webring en phpcherche cours ou exemple sur les TAbcontrol
Plus de sujets relatifs à : [awk] je cherche à faire un truc un peu particulier...


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