#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.
En 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.
En 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
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
"%-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
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
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