script awk

script awk - Programmation

Marsh Posté le 08-07-2004 à 15:11:16    

salut ,
 
Voila je fait un petit script pour compter le nombre de ligne dans un fichier .c mais sans prendre en compte les commentaire qui commence par  
/*    */ ou par
//    //
 
j'ai des soucis avec mon expression reg
 
$1 !~ /\/*/ && /\/\//
 
un petit coup de mains svp.  :whistle:  
 

Reply

Marsh Posté le 08-07-2004 à 15:11:16   

Reply

Marsh Posté le 08-07-2004 à 15:24:20    

voila mon code  
 
BEGIN {
   cpt = 0
   titre = "Le nombre de lignes"
$1 !~ /^\/*/ && $1 !~ /^\/\/ { cpt++ }
END { print titre cpt }

Reply

Marsh Posté le 08-07-2004 à 16:11:01    

KelvintHopps a écrit :

voila mon code  
 
BEGIN {
   cpt = 0
   titre = "Le nombre de lignes"
$1 !~ /^\/*/ && $1 !~ /^\/\/ { cpt++ }
END { print titre cpt }


 
J'aurais plutôt un truc du style :
 
BEGIN {
   cpt = 0
   titre = "Le nombre de lignes"
$1 !~ /^\/\*/ && $1 !~ /^\/\// && $1 !~ /\*\/$/ { cpt++ }
END { print titre cpt }
 
J'espère que cela ira ...  ;)
 
 
A+


Message édité par Stafy le 08-07-2004 à 16:12:07
Reply

Marsh Posté le 08-07-2004 à 16:52:26    

Merci pour ton aide je vais essayer ça

Reply

Marsh Posté le 08-07-2004 à 17:05:52    

sauf que ça marche pas pour un truc du genre :

Code :
  1. /* bla
  2. bla
  3. pouet */


ça comptera 1 ligne au lieu de 0
 
EDIT : tiens, pour joce non plus, ça marche pas [:ddr555]


Message édité par bobuse le 08-07-2004 à 17:06:43
Reply

Marsh Posté le 08-07-2004 à 17:06:38    

$1 !~ /^\/\*/ && $1 !~ /^\/\// && $1 !~ /\*\/$/ { cpt++ }
 
Awk c'est tellement beau que parfois on dirait du perl :)

Reply

Marsh Posté le 08-07-2004 à 17:18:08    

bobuse a écrit :

sauf que ça marche pas pour un truc du genre :

Code :
  1. /* bla
  2. bla
  3. pouet */


ça comptera 1 ligne au lieu de 0


 
Bon .. OK ... mea culpa ...  :sarcastic:  
 
Alors :
 
#!/usr/bin/ksh
 
awk '
BEGIN {
 flag = 1
 cpt = 0
 titre = "Le nombre de lignes : "
}
$1 ~ /^\/\*/ {
 flag = 0
}
$1 ~ /\*\/$/ {
 flag = 1
}
$1 !~ /^\/\*/ && $1 !~ /^\/\// && $1 !~ /\*\/$/ && flag != 0 {
 cpt++
}
END {
print titre cpt
}' $1

Reply

Marsh Posté le 08-07-2004 à 17:22:18    

En effet ça marchait pas très bien mais bon ct un bon début , j'ai pas eu le tps de tester le reste mais promis demain c'est fait et je vous tiens au courant.
Merci à vous.

Reply

Marsh Posté le 12-07-2004 à 10:39:25    

Hello
 
Dis-moi Stafy, je comprends pas prkoi tu testes */$ ; en C les commentaire sont formatés soit avec //commentaire soit avec /*commentaire*/ non ?
Peux-tu t'expliquer stp.

Reply

Marsh Posté le 12-07-2004 à 10:45:57    

KelvintHopps a écrit :

Hello
 
Dis-moi Stafy, je comprends pas prkoi tu testes */$ ; en C les commentaire sont formatés soit avec //commentaire soit avec /*commentaire*/ non ?
Peux-tu t'expliquer stp.


 
Comme le dit très justement bobuse, les commentaires sont une portion de texte commençant par /* et finissant par le premier */ rencontrés, y compris sur plusieurs lignes.
 
Est-ce que cela fonctionne maintenant ?
 :)


Message édité par Stafy le 12-07-2004 à 10:46:39
Reply

Marsh Posté le 12-07-2004 à 10:45:57   

Reply

Marsh Posté le 12-07-2004 à 11:25:05    

Je n'arrive pas à voir la bonne fonctionnalité du script pour des cas comme celui-ci
 
/*blabla
blablablabla
blablablabla

blablablabla*/
 
Sur la deuxième ligne, on teste si
le début de ligne ne commence pas par /*
le début de ligne ne commence pas par //
la fin de ligne ne se termine pas par */
et si le flag est différent de 0 donc =1 cad si  la fin de ligne ne se termine pas par */
 
Donc pour moi les 2 lignes en rouge sont comptées ce qui ne devrait pas et ce qui n'est pas (j'ai testé) mais je ne comprend pas le prkoi.
Can you explain to me please :jap:  

Reply

Marsh Posté le 12-07-2004 à 11:34:37    


C'est bon j'ai compris dsl mais c que lundi matin et ce WE à été très fatiguant ;)
Merci bien pour ton aide :)

Reply

Marsh Posté le 12-07-2004 à 11:34:46    

KelvintHopps a écrit :

Donc pour moi les 2 lignes en rouge sont comptées ce qui ne devrait pas et ce qui n'est pas (j'ai testé) mais je ne comprend pas le prkoi.
Can you explain to me please :jap:


 
En fait, le compteur s'incrémente si :
  - la ligne ne commence pas par //
  - la ligne ne comporte ni /* et ni */
  - le flag est à 1 .. donc non dans une série de lignes commentaires
 
Si les deux premières conditions sont remplies ... mais que le flag est à 0 .. cela signifie qu'avant on a eu le /* mais qu'il n'y a toujours pas eu de fin de commentaire (*/).


Message édité par Stafy le 12-07-2004 à 11:41:56
Reply

Marsh Posté le 12-07-2004 à 11:35:29    

Et oui ton script fonctionne bien pas de soucis  
Merci encore

Reply

Marsh Posté le 12-07-2004 à 15:58:58    

j'ai une modif en fait par rapport au départ je doit varier aussi les lignes qui commence par ;// et @" ma ligne de code est  
$1 !~ /^\/\*/ && $1 !~ /^\/\// && $1 !~ /\*\/$/ && flag != 0 && $1 !~ /^\;\/\// && $1 !~ /\@\"/ {  
 cpt++  
 print $0 >> "h:/outil/result.txt"
 
mais ça fonctionne pas  
j'ai essayé plusieurs syntaxe mais pas de prise en compte de ces lignes.
J'en appelle à toi Stafy, si tu peux m'aider encore un peu :)

Reply

Marsh Posté le 12-07-2004 à 16:37:50    

Nan c bon, le prob ct ma redirection >> qui bien sur rajoute à la fin du fichier et mo j'ai regardé que le début
Donc pas de soucis ça fonctionne bien

Reply

Marsh Posté le 12-07-2004 à 17:20:53    

KelvintHopps a écrit :

Nan c bon, le prob ct ma redirection >> qui bien sur rajoute à la fin du fichier et mo j'ai regardé que le début
Donc pas de soucis ça fonctionne bien


 
Effectivement ...  ;)  
 
Cependant je viens de m'apercevoir d'un bug dans mon awk ...
Je t'explique ... comme j'utilisais $1 pour tester les champs il fallait obligatoirement que la chaine */ soit en début de ligne .. or ce n'est pas toujours le cas  :sarcastic:  
 
De ce fait j'ai modifié le code comme indiqué ci-dessous :
 
#!/usr/bin/ksh  
 
awk '  
BEGIN {  
 flag = 1  
 cpt = 0  
 titre = "Le nombre de lignes : "  
}  
$0 ~ /^\/\*/ {  
 flag = 0  
}  
$0 ~ /\*\/$/ {
 flag = 1  
}  
$0 !~ /^\/\*/ && $0 !~ /^\/\// && $0 !~ /\*\/$/ && $0 !~ /^;\/\// && $0 !~ /^\@\"/ && flag != 0 {  
 print $0
 cpt++
}  
END {  
print titre cpt  
}' $1 > FicRes.txt
 
 
N'hésites pas à me dire si ça fonctionne convenablement .. et si tu as des questions n'hésites pas.
 :)

Reply

Marsh Posté le 12-07-2004 à 17:46:19    

En effet, pour une ligne comme celle-ci ça ne fonctionnait pas  
static T_UWORD ruw_IST_Result;  /* IST result : calculated by IST_Algo_X(), used by IST_Management() */
 
car il trouve */ en fin de ligne  
J'ai testé ton script mais il ne fonctionne pas, prkoi, je sais pas encore , il m'affiche même pas le titre avec le nombre de ligne mais bon ça doit pas être bien grave je venair demain et je te tiens au courant
Merci pour ton aide

Reply

Marsh Posté le 12-07-2004 à 17:51:11    

KelvintHopps a écrit :

Merci pour ton aide


 
De rien .. ça me fait progresser ...
 ;)  
 
 :hello:  

Reply

Marsh Posté le 13-07-2004 à 10:23:09    


Salut Stafy,
 
Ton script n'est pas bon pour 2 raisons :
Il ne prend pas en compte les lignes de code qui sont suivies par un commentaire, du genre
 
#include <bdframwo.h>   /*opening of an aligned RAM word class*/
 
et d'autre part les lignes vides sont comptées  
 

Reply

Marsh Posté le 13-07-2004 à 11:07:45    

KelvintHopps a écrit :

Salut Stafy,
 
Ton script n'est pas bon pour 2 raisons :
Il ne prend pas en compte les lignes de code qui sont suivies par un commentaire, du genre
 
#include <bdframwo.h>   /*opening of an aligned RAM word class*/
 
et d'autre part les lignes vides sont comptées


 
Tu peux essayer ça maintenant :
 
#!/usr/bin/ksh  
awk '  
BEGIN {  
 flag = 1  
 cpt = 0  
 titre = "Le nombre de lignes : "  
}  
$0 ~ /\/\*/ {  
 flag = 0  
}  
$0 ~ /\*\// {
 flag = 1  
}  
$0 !~ /^\/\*.*\*\/$/ && $0 !~ /.*\*\/$/ && $0 !~ /^.*\/\// && $0 !~ /^;\/\// && $0 !~ /^\@\"/ && $0 !~ /^$/ && flag != 0 {  
 print $0
 cpt++
}
END {  
print titre cpt  
}' $1
 
Tiens moi au courant ..
;)

Reply

Marsh Posté le 13-07-2004 à 11:09:03    

Ci dessous le fichier en entrée :
 
#include <bdframwo.h>   /*opening of an aligned RAM word class*/
 
1 qzegqjsbd
// TOTO
2 qzegqjsbd
 
/* TOTO
TOTO
TOTO
TOTO */
3 qzegqjsbd
 
/* TOTO */
4 qzegqjsbd
/* TOTO
TOTO
*/
 
5 qzegqjsbd
;// TOTO
6 qzegqjsbd
 
7 qzegqjsbd
@"TOTO
8 qzegqjsbd
 
 
Et le résultat :
 
1 qzegqjsbd
2 qzegqjsbd
3 qzegqjsbd
4 qzegqjsbd
5 qzegqjsbd
6 qzegqjsbd
7 qzegqjsbd
8 qzegqjsbd
Le nombre de lignes : 8

Reply

Marsh Posté le 13-07-2004 à 11:28:02    

On a du mal se comprendre au niveau du résultat à obtenir car la 1ere ligne il faut qu'elle soit pris en compte peut importe le commentaire qui suit c'est quand même une ligne de code. :)

Reply

Marsh Posté le 13-07-2004 à 11:31:18    

En fait voila ce qui marche (enfin pour le momment  :ange: )
 
#!/usr/bin/ksh  
awk '  
BEGIN {  
 flag = 1  
 cpt = 0  
 titre = "Le nombre de lignes : "  
}  
$0 ~ /\/\*/ {  
 flag = 0  
}  
$0 ~ /\*\// {  
 flag = 1  
}  
$0 !~ /^\/\*.*\*\/$/ &&  $0 !~ /^.*\/\// && $0 !~ /^;\/\// && $0 !~ /^\@\"/ && $0 !~ /^$/ && flag != 0 {  
 print $0 > "./fich_resul.txt"
 cpt++  
}  
END {  
print titre cpt  
}' $1  
 
J'ai juste supprimé le teste de fin de ligne   :ouch:  

Reply

Marsh Posté le 13-07-2004 à 11:36:46    

en fait ça prend bien en compte les lignes suivies d'un commentaire mais je me retrouve avec des lignes du style  
 
*********************************************************/
 
normal.Je me demande s'il ne faudrait pas inclure un tant que cad si trouve /* tant que pas */ passe ligne suivante nan ?

Reply

Marsh Posté le 13-07-2004 à 11:37:26    

KelvintHopps a écrit :

J'ai juste supprimé le teste de fin de ligne   :ouch:


 
Ca ne fonctionne pas encore correctement .. car ça donne ça dans mon jeu test :
 
#include <bdframwo.h>   /*opening of an aligned RAM word class*/
1 qzegqjsbd
2 qzegqjsbd
TOTO */
3 qzegqjsbd
4 qzegqjsbd
*/
5 qzegqjsbd
6 qzegqjsbd
7 qzegqjsbd
8 qzegqjsbd
Le nombre de lignes : 11
 
A suivre donc ...  :sweat:

Reply

Marsh Posté le 13-07-2004 à 14:43:22    

Bon voilà ma contribution.
Je me contente de supprimer les lignes qu'il faut,il reste plus qu'à compter le résultat (wc -l)

gawk ' /^[[:blank:]]*\/\// {next; }; /^[[:blank:]]*\/\*/ {flag=1; next;}; /\/\*/ {flag=1; print; next;}; /\*\/$[[:blank:]]*/ {flag=0; next;} /\*\// {flag=0; print; next;}; {if (!flag) print}'


 
Il reste au moins un bug, c'est les lignes du genre

/* commentaire */ return 0;

Reply

Marsh Posté le 13-07-2004 à 15:19:04    

Salut bobuse,
 
Intéréssant ton script, mais je vais essayé d'en finir avec celui que l'on commencé avec stafy.
En fait je n'aiplus qu'un problème à régler; celui ci :
 
 
/*   $Workfile:                       |     PROCESSOR:
 ****************************************************************************
 *   $Author:
 *   $Date:  
 ****************************************************************************
 *   $Revision:   1.2  $    |  PROJECT:       |  COMPILER:                            
 ****************************************************************************/
 
sur cet exemple il me compte la ligne en rouge et c'est pas bon  
 
ça c'est le script
 
 
#!/usr/bin/ksh  
awk '  
BEGIN {  
 flag = 1  
 cpt = 0  
 titre = "Le nombre de lignes : "  
}  
$1 ~ /\/\*/ {  
 flag = 0  
}  
$1 ~ /\*\// {  
 flag = 1  
}  
$1 !~ /^\/\*.*\*\/$/ &&  $1 !~ /^.*\/\// && $1 !~ /^;\/\// && $1 !~ /^\@\"/ && $1 !~ /^$/ && flag != 0 {  
 print $0 > "./fich_resul.txt"
 cpt++  
}  
END {  
print titre cpt  
}' $1  
 
En fait c'est simple : Si trouve /*  ; tant que pas trouve */ passage ligne suivante , mais pas si simple à coder enfin pour un débutant comme moi  :cry:  

Reply

Marsh Posté le 13-07-2004 à 15:27:21    

Bon voilà, ça a l'air de marcher comme ça :

gawk ' /^[[:blank:]]*\/\// {next; }; /^[[:blank:]]*\/\*.*\*\/[[:blank:]]*$/ {next;}; /\/\*.*\*\/.*[^[:blank:]]+.*$/ {print; next;} /^[[:blank:]]*\/\*/ {flag=1; next;}; /\/\*/ {flag=1; print; next;}; /\*\/[[:blank:]]*$/ {flag=0; next;} /\*\// {flag=0; print; next;}; flag==0 {print}'


:)

Reply

Marsh Posté le 13-07-2004 à 16:18:18    

Et dans notre version .. je pense avoir également trouvé :
 
#!/usr/bin/ksh
awk '  
BEGIN {flag=1;cpt=0;titre="Le nombre de lignes : "}
$0 ~ /\/\*/ && $0 !~ /\*\// {
 flag = 0
}
$0 ~ /\*\// && $0 !~ /\/\*/ {
 flag = 1
 next
}
$0 !~ /^\/\*.*\*\/$/ && $0 !~ /^.*\/\// && $0 !~ /^;\/\// && $0 !~ /^\@\"/ && $0 !~ /^$/ && flag != 0 {  
 print $0
 cpt++
}
END {print titre cpt}' $1
exit 0
 
 :bounce:


Message édité par Stafy le 13-07-2004 à 16:23:01
Reply

Marsh Posté le 13-07-2004 à 16:48:07    


C'est quel chose dans ce style que je voudrais faire  
Est-ce une mauvaise idée
 
 
#!/usr/bin/ksh  
awk '  
BEGIN {  
 flag = 1  
 cpt = 0  
 titre = "Le nombre de lignes : "  
}  
$1 ~ /\/\*/ {  
 flag = 0  
 while '$0 !~ /\*\//$' do next
}  
$1 ~ /\*\// {  
 flag = 1  
}  
$1 !~ /^\/\*.*\*\/$/ &&  $1 !~ /^.*\/\// && $1 !~ /^;\/\// && $1 !~ /^\@\"/ && $1 !~ /^$/ && flag != 0 {  
 print $0 > "./fich_resul.txt"
 cpt++  
}  
END {  
print titre cpt  
}' $1  
 
 
J'ai testé ton script stafy mais ça ma pas l'air de marcher, je ne me suis pas vraiment penché dessus non plus

Reply

Marsh Posté le 13-07-2004 à 16:50:40    

Stafy ou bobuse ,
 
je comprends pas très bien ceci $1 !~ /^\/\*.*\*\/$/  
Tu cherches en début de ligne /* une multitude de fois jusqu'en fin de ligne ?

Reply

Marsh Posté le 13-07-2004 à 16:54:34    

C'est juste pour dire que la chaîne doit matcher :
  - /* en début de ligne
  - */ en fin de ligne
  - n'importe quels caractères entre les deux (.*)


Message édité par Stafy le 13-07-2004 à 16:55:04
Reply

Marsh Posté le 13-07-2004 à 16:57:37    

KelvintHopps a écrit :

J'ai testé ton script stafy mais ça ma pas l'air de marcher, je ne me suis pas vraiment penché dessus non plus


 
Bah  :??:  
Ca fonctionne pourtant ici ...
Tu pourrais me faire un copier coller de ton script test (ou un extrait) qui doit être parcouru par le awk stp ?
 
Voici mon jeu test :
 
/*   $Workfile:                       |     PROCESSOR:
 ****************************************************************************
 *   $Author:
 *   $Date:
 ****************************************************************************
 *   $Revision:   1.2  $    |  PROJECT:       |  COMPILER:
 ****************************************************************************/
1 #include <bdframwo.h>   /*opening of an aligned RAM word class*/
2 Ligne test
// TOTO
3 Ligne test
 
/* TOTO
TOTO
TOTO */
3 Ligne test
/* TOTO */
4 Ligne test
/* TOTO
TOTO
*/
5 Ligne test
;// TOTO
6 Ligne test
@"TOTO
 
Et voici le résultat :
 
1 #include <bdframwo.h>   /*opening of an aligned RAM word class*/
2 Ligne test
3 Ligne test
3 Ligne test
4 Ligne test
5 Ligne test
6 Ligne test
Le nombre de lignes : 7
 
Donc ça a l'air de fonctionner .. non ?
 :(

Reply

Marsh Posté le 13-07-2004 à 17:08:33    

et s'il y a des espaces/tabulations avant un /* ;) ?

Reply

Marsh Posté le 13-07-2004 à 17:13:32    

bobuse a écrit :

et s'il y a des espaces/tabulations avant un /* ;) ?


 
Ah ouais .. mais là c'est plus marrant ...
 :ange:  
 
Ok j'y retourne ..
 :jap:

Reply

Marsh Posté le 13-07-2004 à 17:34:33    

Je fais court :
 
$0 !~ /^[ \t]*\/\*.*\*\/$/ && $0 !~ /^\/\*.*\*\/$/ && $0 !~ /^.*\/\// && $0 !~ /^;\/\// && $0 !~ /^\@\"/ && $0 !~ /^$/ && flag != 0 {  
 print $0
 cpt++
}

Reply

Marsh Posté le 13-07-2004 à 17:45:29    

/*~+:***********************************************************************************************/
/*~+:   EXTERNAL FUNCTIONS                                                                           */
/*~+:*/
/*~+:***********************************************************************************************/
/*~+:*/
/*~F*/
void NEAR_FCT IST_Algo_0(void)
/*~-*/
{
   /*~T*/
 
   /*~T*/
#pragma asm
 
   ;// Register usage
 
    @"  *****************************************************************************  "
    @"  Register Usage:    "
    @"  REG1  : register for indirect address mode (const.area, rul_IST_Calc_Temp_Dat1 = XRAM)  "
    @"  REG2  : register for indirect address mode (rul_IST_Calc_Temp_Dat2 = external RAM)   "
    @"  REG3  : working register for calculation tests  "
    @"  REG4  : return parameter result value  "
    @"  REG5  : temporary register for flag tests  "
 
 
 
resultat apres passage
 
void NEAR_FCT IST_Algo_0(void)
{
  /*~T*/
   /*~T*/
#pragma asm
    @"  *****************************************************************************  "
    @"  Register Usage:    "
    @"  REG1  : register for indirect address mode (const.area, rul_IST_Calc_Temp_Dat1 = XRAM)  "
    @"  REG2  : register for indirect address mode (rul_IST_Calc_Temp_Dat2 = external RAM)   "
    @"  REG3  : working register for calculation tests  "
    @"  REG4  : return parameter result value  "
   @"  REG5  : temporary register for flag tests  "
     
 
 

Reply

Marsh Posté le 13-07-2004 à 17:50:37    

Bon ben je vais me coucher ... je reviendrais la semaine prochaine ...
;)
 
A+

Reply

Marsh Posté le 13-07-2004 à 17:55:16    

Ca y est c'est le bon je crois , j'ai juste changé le $0 en $1 pour varer les @"
 
Merci à vous les gars
 
 
#!/usr/bin/ksh  
awk '  
BEGIN {flag=1;cpt=0;titre="Le nombre de lignes : "}  
$0 ~ /\/\*/ && $0 !~ /\*\// {  
 flag = 0  
}  
$0 ~ /\*\// && $0 !~ /\/\*/ {  
 flag = 1  
 next  
}  
$0 !~ /^[ \t]*\/\*.*\*\/$/ && $0 !~ /^\/\*.*\*\/$/ && $0 !~ /^.*\/\// && $0 !~ /^;\/\// && $1 !~ /^\@\"/ && $0 !~ /^$/ && flag != 0 {  
 print $0 > "./resultat.txt"
 cpt++  
}  
END {print titre cpt}' $1  

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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