Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 26/06/2017, à 16:46

MINYA

Délimiter un champs avec awk

Je voudrais faire cette opération pour chaque classe [((20-17)+1)+((19-16)+1)+((19-14)+1)] ensuite faire l'addition de tout (a+b+c), et l'enregistrer dans une variable pour l'utiliser après dans un calcul, comment faire pour délimiter le champ entre les classes, pour faire justement cette addition (a+b+c) ?

  ##classe
premier          abc    12 09 6            personne=nom1 17 20; 
premier          abc     11 9  6            personne=nom1 16 19 ;
premier         abc     30 9 15           personne=nom1 14 19 ;
##classe
 
deuxième       abc     5 7 9            personne=nom2 15 17  ;
deuxième       abc     56 5 9          personne=nom2 10 20  ;
deuxième      abc     8 9 4           personne=nom2  8 13;
deuxième     abc    1 56 7           personne=nom2 5 12 ;  

Peace

Hors ligne

#2 Le 26/06/2017, à 23:44

Watael

Re : Délimiter un champs avec awk

«
Philippe : Votre mâchoire vous êtes blessé, là ?
Antoine : Hein ?
Philippe : Vous avez mal quand vous parlez, là, non ?
Antoine : Quo ?
Philippe : Votre mâchoire, ça va là ?
»
Bienvenue chez les Ch'tis.

non, parce que, là, on ne vous comprend pas très bien.

Dernière modification par Watael (Le 26/06/2017, à 23:44)


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#3 Le 27/06/2017, à 00:05

MINYA

Re : Délimiter un champs avec awk

Peut-on délimiter à partir de [classe1] jusqu'à [class2] pour faire des opération que sur les lignes qui sont entre ces deux champs ? je voudrais faire l'addition de (a+b+c) à l'intérieur de chaque classe.
a =(20-17)+1)
b=(19-16)+1)
c =(19-14)+1)


   ##classe1
premier          abc    12 09 6            personne=nom1 17 20; 
premier          abc     11 9  6            personne=nom1 16 19 ;
premier         abc     30 9 15           personne=nom1 14 19 ;
##classe2
 
deuxième       abc     5 7 9            personne=nom2 15 17  ;
deuxième       abc     56 5 9          personne=nom2 10 20  ;
deuxième      abc     8 9 4           personne=nom2  8 13;
deuxième     abc    1 56 7           personne=nom2 5 12 ; 

Merci


Peace

Hors ligne

#4 Le 27/06/2017, à 00:49

Watael

Re : Délimiter un champs avec awk

quelle importance peut avoir ces "classes" ?
apparemment, tu veux simplement additionner les derniers champs avant le point-virgule !

puis, tu veux additionner le résultat de chaque ligne pour chaque personne (nom1, nom2, nomN...).

et après ?


Connected \o/
Welcome to sHell. · eval is evil.

Hors ligne

#5 Le 27/06/2017, à 01:02

MINYA

Re : Délimiter un champs avec awk

En fait, je voudrais calculer une sorte de score pour chaque classe, et ces fameuses classes, c'est les seules qui permettent de délimiter les champs qui m’intéressent


Peace

Hors ligne

#6 Le 27/06/2017, à 07:43

pingouinux

Re : Délimiter un champs avec awk

Bonjour,
Tes explications ne sont effectivement pas très claires.
Peut-être ceci ?

awk 'function pri(){if(tot) printf("%-10s %s\n",tit,tot)}
$0~"##classe" {pri();tot=0}
{ if(NF>1) { tit=$1; sub(";",""); tot+=$(NF)-$(NF-1)+1 } }
END{pri()}' fichier

qui donne, avec ton exemple

premier    14
deuxième   28

Hors ligne

#7 Le 27/06/2017, à 09:59

MINYA

Re : Délimiter un champs avec awk

Bonjour @ pingouinux

Merci pour la réponse smile
Pouvez-vous m'expliquer un peu le programme, je ne comprends pas tout ! Surtout la première ligne !


Peace

Hors ligne

#8 Le 27/06/2017, à 10:31

pingouinux

Re : Délimiter un champs avec awk

La première ligne définit la fonction pri destinée à imprimer le résultat.
Quand une ligne contient ##classe (ou que l'on arrive à la fin du fichier), j'imprime le résultat de la classe précédente, et réinitialise le total (tot) à 0.
Je ne traite que les lignes contenant plusieurs champs, après avoir supprimé le ; final.

Hors ligne

#9 Le 27/06/2017, à 10:40

MINYA

Re : Délimiter un champs avec awk

pingouinux a écrit :

"%-10s %s\n"
{ if(NF>1) { tit=$1; sub(";",""); tot+=$(NF)-$(NF-1)+1 } }

Pouvez-vous m'expliquer ce que cela veut dire ?

Oui grosso modo j'avais compris, mais pas en détail, car là, il ne fait pas exactement ce que je veux ! Il fait le total pour chaque ligne en fait, mais pas à la fin, du coup mon total est faux. Je voudrais qu'il fasse un total et l'afficher dans le champs 2  après la classe, de cette façon :

   ##classe1 score 
premier          abc    12 09 6            personne=nom1 17 20; 
premier          abc     11 9  6            personne=nom1 16 19 ;
premier         abc     30 9 15           personne=nom1 14 19 ;
##classe2 score 
 
deuxième       abc     5 7 9            personne=nom2 15 17  ;
deuxième       abc     56 5 9          personne=nom2 10 20  ;
deuxième      abc     8 9 4           personne=nom2  8 13;
deuxième     abc    1 56 7           personne=nom2 5 12 ;  

Dernière modification par MINYA (Le 27/06/2017, à 10:45)


Peace

Hors ligne

#10 Le 27/06/2017, à 15:55

LeoMajor

Re : Délimiter un champs avec awk

bonjour,

le formatage du bloc, hypothèse de départ, n'est pas cohérent (erreur de copier coller ?)

awk 'BEGIN {FPAT="([0-9]+)"}; /##classe/,/^$/ { if($0~/classe/){print $0;tot=0}; if(NF>1){tot=tot+$NF-$(NF-1)+1; print tot,$0}; if(NF==0){print "total "tot; print }}' /tmp/test.txt
##classe2
4 premier          abc    12 09 6            personne=nom1 17 20; 
8 premier          abc     11 9  6            personne=nom1 16 19 ;
14 premier         abc     30 9 15           personne=nom1 14 19 ;
total 14

##classe10
3 deuxième       abc     5 7 9            personne=nom2 15 17  ;
14 deuxième       abc     56 5 9          personne=nom2 10 20  ;
20 deuxième      abc     8 9 4           personne=nom2  8 13;
28 deuxième     abc    1 56 7           personne=nom2 5 12 ;  
total 28

Hors ligne

#11 Le 03/07/2017, à 09:45

MINYA

Re : Délimiter un champs avec awk

LeoMajor a écrit :

awk 'BEGIN {FPAT="([0-9]+)"}; /##classe/,/^$/ { if($0~/classe/){print $0;tot=0}; if(NF>1){tot=tot+$NF-$(NF-1)+1; print tot,$0}; if(NF==0){print "total "tot; print }}' /tmp/test.txt

Merci !

Je voudrais faire aussi ce calcul, mais là, je n'ai absolument aucune idée sur comment je dois procéder?


 ##classe2
4 premier          abc    12 09 6            personne=nom1 a b; 
8 premier          abc     11 9  6            personne=nom1 c d ;
14 premier         abc     30 9 15           personne=nom1 e f;

(je voudrais faire cette opération (f-a)+1

C-à-d :

 ##classe2
4 premier          abc    12 09 6            personne=nom1 17 20; 
8 premier          abc     11 9  6            personne=nom1 16 19 ;
14 premier         abc     30 9 15           personne=nom1 14 19;
Donc (19-17)+1= 3

##classe10
3 deuxième       abc     5 7 9            personne=nom2 6 17  ;
14 deuxième       abc     56 5 9          personne=nom2 10 20  ;
20 deuxième      abc     8 9 4           personne=nom2  8 13;
28 deuxième     abc    1 56 7           personne=nom2 5 12 ;  
Donc (12-6)+1= 7
 

Dernière modification par MINYA (Le 03/07/2017, à 09:50)


Peace

Hors ligne

#12 Le 03/07/2017, à 14:26

MINYA

Re : Délimiter un champs avec awk

LeoMajor a écrit :

  awk 'BEGIN {FPAT="([0-9]+)"}; /##classe/,/^$/ { if($0~/classe/){print $0;tot=0}; if(NF>1){tot=tot+$NF-$(NF-1)+1; print tot,$0}; if(NF==0){print "total "tot; print }}' /tmp/test.txt

Voilà ce que j'obtiens avec :

 ##classe2
4 premier          abc    12 09 6            personne=nom1 17 20 4; 
8 premier          abc     11 9  6            personne=nom1 16 19  8;
14 premier         abc     30 9 15           personne=nom1 14 19 12 ;


##classe10
3 deuxième       abc     5 7 9            personne=nom2 15 17 3  ;
14 deuxième       abc     56 5 9          personne=nom2 10 20 14 ;
20 deuxième      abc     8 9 4           personne=nom2  8 13 21;
28 deuxième     abc    1 56 7           personne=nom2 5 12  29;  
 

Autrement dit, il fait bien l'opération (b-a)+1(exepmle)

 ##classe2
4 premier          abc    12 09 6            personne=nom1 17 20 4; (20-17)+1 = 4 mais il l'additionne directement avec la deuxième ligne qui (4+4)=8
8 premier          abc     11 9  6            personne=nom1 16 19  4; (19-16)+1 = 4  8  qui est aussi additionné avec la troisième ligne 
14 premier         abc     30 9 15           personne=nom1 14 19 6;   (19-14)+1= 6  qui donne 6+8=12 

   

Je voudrais récupérer ce résultat 12 dans une variable pour l'utiliser dans mes calculs, ou additionner tout dans une variable, qui me donnera le total. parce que là, le total est une sorte de liste, qui représente l’addition de chaque ligne avec une autre. (4,8,12), alors que je veux juste le total qui est 12.


Merci encore

Dernière modification par MINYA (Le 03/07/2017, à 14:31)


Peace

Hors ligne