Recap d'items avec AWK
Résolu/Fermémamiemando Messages postés 33446 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 20 décembre 2024 - 8 déc. 2023 à 15:40
- Recap d'items avec AWK
- Recap trajet google - Guide
- Récap maladie - Forum Excel
- Ps awk ✓ - Forum Debian
- Récupération des items. - Forum Minecraft
- C'est quoi un items?? c# - Forum C#
7 réponses
Modifié le 15 nov. 2023 à 12:47
hello
MRBTS<span>;</span>FHDB<span>;</span>AHMA<span>;</span>FSMF<span>;</span>FBBC<span>;</span>FBBA<span>;</span>FRGY<span>;</span>FXED<span>;</span>ARMA
l'ordre de ces champs est-il important ?
Modifié le 16 nov. 2023 à 13:42
Bonjour,
Tu peux utiliser un tableau avec deux niveaux d'indexation.
recap.awk
BEGIN { FS=";" } { # Parse each input line row = $2 col = $3 # Is it a new row key? found_row = 0 for (i = 0; i < length(rows); i++) { if (rows[i] == row) { found_row = 1 break } } if (found_row == 0) { rows[length(rows)] = row } # Is it a new column key? found_col = 0 for (j = 0; j < length(cols); j++) { if (cols[j] == col) { found_col = 1 break } } if (found_col == 0) { cols[length(cols)] = col } # Increment counter d[i, j]++ } END { # Export CSV # Header printf("MRBTS;") for (j = 0; j < length(cols); j++) { printf(cols[j]) if (j < length(cols) - 1) { printf(";") } } printf("\n") # Rows for (i = 0; i < length(rows); i++) { printf(rows[i] ";") for (j = 0; j < length(cols); j++) { if (d[i, j]) { printf(d[i, j]) } else { printf(0) } if (j < length(cols) - 1) { printf(";") } } printf("\n") } }
Exécution :
awk -f recap.awk toto.csv
Résultat :
mrbts;FHDB;AHMA;FSMF;FBBC;FBBA;FRGY;FXED;ARMA
MRBTS-16093;3;3;1;1;1;0;0;0
MRBTS-16157;3;0;2;2;0;3;1;1
MRBTS-16171;3;0;1;1;1;0;0;1
Bonne chance
15 nov. 2023 à 13:49
Bonjour Mamiemando,
Merci beaucoup pour ton aide
15 nov. 2023 à 20:39
Bonsoir,
J ai testé le script Recap.awk , mais j'ai cette erreur sur ma machine
]$ awk -f Recap.awk GHIS.csv awk: Recap.awk:19: (FILENAME=GHIS.csv FNR=1) fatal: attempt to use scalar `rows' as an array
16 nov. 2023 à 13:41
Je viens de re-tester, chez moi ça marche. Dans mon cas, awk est en réalité un mawk.
(mando@silk) (~) $ awk --version
mawk 1.3.4 20230808
Copyright 2008-2022,2023, Thomas E. Dickey
Copyright 1991-1996,2014, Michael D. Brennan
random-funcs: arc4random_stir/arc4random
regex-funcs: internal
compiled limits:
sprintf buffer 8192
maximum-integer 9223372036854775808
Je pense que ta version de awk nécessite de pré-déclarer les tableaux (en l'occurrence, rows, cols et d dans le bloc BEGIN comme expliqué dans ce lien.
BEGIN { FS =";" split("", rows) split("", cols) split("", d) }
Bonne chance
16 nov. 2023 à 15:09
bonjour Mamiemando,
Merci beaucoup ton feedback, ci-dessous la version de mon awk
]$ awk --version GNU Awk 4.2.1, API: 2.0 (GNU MPFR 3.1.6-p2, GNU MP 6.1.2) Copyright (C) 1989, 1991-2018 Free Software Foundation. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see http://www.gnu.org/licenses/.
17 nov. 2023 à 12:23
As-tu essayé de déclarer les tableaux dans BEGIN, comme je t'ai proposé dans #6 ? Est-ce qu'avec cette modification, ça marche ?
Modifié le 28 nov. 2023 à 12:58
Bonsoir Mamiemando,
Desolé pour la reponse trardive , oui j'ai essayé en ajoutant les lignes pour le tableau comme vous l'aviez spécifié.
et cela ne m'affiche que ligne alors que mon fichier comporte plus de 24000 lignes
$ awk -f Recap.awk 20231117_RI_09h56 MRBTS;FXDB MRBTS-99991;1
le contenue du fichier à traiter
$ more 20231117_RI_09h56 20231117;MRBTS-10001;FBBC;NK170831532;Baigon_G9U9U21_OST_070_sBTS1 20231117;MRBTS-10001;FBBC;NK164130226;Baigon_G9U9U21_OST_070_sBTS1 20231117;MRBTS-10001;FSMF;AS174513605;Baigon_G9U9U21_OST_070_sBTS1 20231117;MRBTS-10001;FRGU;AS173390617;Baigon_G9U9U21_OST_070_sBTS1 20231117;MRBTS-10001;FXDB;F7174501686;Baigon_G9U9U21_OST_070_sBTS1 20231117;MRBTS-10001;ARDA;K9230637543;Baigon_G9U9U21_OST_070_sBTS1 20231117;MRBTS-10002;FXED;F7165206501;Baigon_G18L8L18_OST_070_MRBTS2 20231117;MRBTS-10002;FBBC;AS190438467;Baigon_G18L8L18_OST_070_MRBTS2 20231117;MRBTS-10002;FBBA;F7164350670;Baigon_G18L8L18_OST_070_MRBTS2 20231117;MRBTS-10002;FSMF;AS191416094;Baigon_G18L8L18_OST_070_MRBTS2 20231117;MRBTS-10002;FRMF;F7190608873;Baigon_G18L8L18_OST_070_MRBTS2 20231117;MRBTS-10011;FRMF;L1164614704;Demdeng_G9U9U21L8_OST_088_MRBTS1 20231117;MRBTS-10011;FRGU;AS180653697;Demdeng_G9U9U21L8_OST_088_MRBTS1 20231117;MRBTS-10011;FBBC;AS183221305;Demdeng_G9U9U21L8_OST_088_MRBTS1 20231117;MRBTS-10011;FBBC;AS190438509;Demdeng_G9U9U21L8_OST_088_MRBTS1 20231117;MRBTS-10011;FSMF;AS174520187;Demdeng_G9U9U21L8_OST_088_MRBTS1 20231117;MRBTS-10011;FXDB;F7171231156;Demdeng_G9U9U21L8_OST_088_MRBTS1 20231117;MRBTS-1001;AMIA;F7171231156;Labogenie_G18U21L18L8L26_CTR_015_MRBTS1 20231117;MRBTS-1001;FXED;F7170404792;Labogenie_G18U21L18L8L26_CTR_015_MRBTS1 20231117;MRBTS-1001;AZHA;EA224453643;Labogenie_G18U21L18L8L26_CTR_015_MRBTS1 20231117;MRBTS-1001;AZHA;EA224359390;Labogenie_G18U21L18L8L26_CTR_015_MRBTS1 20231117;MRBTS-1001;ARMA;1M222430372;Labogenie_G18U21L18L8L26_CTR_015_MRBTS1 20231117;MRBTS-1001;FRGU;K9162525413;Labogenie_G18U21L18L8L26_CTR_015_MRBTS1 --More--(0%)
Le contenu du script awk
BEGIN { FS=";" } split("", rows) split("", cols) split("", d) { # Parse each input line row = $2 col = $3 # Is it a new row key? found_row = 0 for (i = 0; i < length(rows); i++) { if (rows[i] == row) { found_row = 1 break } } if (found_row == 0) { rows[length(rows)] = row } # Is it a new column key? [...]
21 nov. 2023 à 14:37
SI le problème ne se pose que pour les larges fichiers de données, cela laisse entendre que c'est une limitation de awk. Deux solutions du coup :
- soit tu codes ton script dans un autre langage, qui n'aura pas ces limitations (par exemple en python),
- soit tu traites tes fichiers par batch suffisamment petits, puis tu agrèges les différents résumés (soit à la main, soit avec un autre script).
Personnellement je serais plus de l'école python...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionModifié le 28 nov. 2023 à 13:02
Bonjour Mamiemando,
J'ai pu retrouver dans un vieux post la commande qui le fait ci-dessous le code.
Merci encore à tous votre pour support.
format_RI.awk
{ t1[$1, $2]++; t2[$3]++; t[$1, $2, $3]++ } END { printf "Date;MRBTS;"; for (n in t2) printf n FS print "" for (n in t1) { n1 = n; gsub(SUBSEP, FS, n1); printf n1 FS; for (n2 in t2) if (x = t[n, n2]) printf x FS ; else printf "0;" print "" } printf "TOTAL;"; for (n in t2) printf t2[n] FS print "" }
awk -F ";" -f Format_RI.awk file1
Date;MRBTS;AHMA;FRMB;ASIB;FRGU;ARPA;FBBC;ARDA;FYGB;AREA;AHEGA;AHDA;FHEL;FRGY;FYGC;FRMF;FRPD;AYGE;AHPMDA;ARGA;ABIA;AHEB;AHPD;FHDB;AHGA;AZHA;AHED;AMIA;FXDB;FR;FSMF;FXDD;ARMA;FXED;ASIA;FBBA; 20231128;MRBTS-2451;0;0;1;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;3;0;0;0;0;0;0;1;1;0;0;0;0;0;0;0; 20231128;MRBTS-54011;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0; 20231128;MRBTS-2452;0;0;0;1;0;3;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;2;0;0;1;0;0; 20231128;MRBTS-54012;0;0;0;0;0;1;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;1;0;0;0; 20231128;MRBTS-2453;0;0;1;0;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0;1;0;0;0;0;3;0;1;0;0;0;0;0;0;0;0; 20231128;MRBTS-34861;0;0;0;1;0;2;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0; 20231128;MRBTS-34862;0;0;0;0;0;2;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;1;0;1;1;0;0; 20231128;MRBTS-6341;3;0;2;0;0;0;0;0;0;0;0;0;3;1;0;0;0;0;0;5;0;0;0;0;3;0;1;0;0;0;0;0;3;0;0; 20231128;MRBTS-24341;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;1;0;0;0;0;0; 20231128;MRBTS-6343;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;3;0;0;0;0;0;0;1;0;0;0;0;0; 20231128;MRBTS-15611;0;0;0;0;0;1;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;1;0;1;0;0;0;0;0; 20231128;MRBTS-1131;0;0;0;0;0;1;0;0;0;0;0;0;3;0;0;0;0;0;0;0;0;0;3;0;0;0;0;0;0;1;0;0;0;0;1; 20231128;MRBTS-1132;3;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;1;0;0;0;0;0;3;0;0; 20231128;MRBTS-19501;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;1;0;0;0;0;0; 20231128;MRBTS-19502;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;1;0;1;0;0;0; 20231128;MRBTS-5021;0;0;0;1;0;3;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;0;0;2;0;0;1;0;1; 20231128;MRBTS-10401;0;0;0;0;0;2;0;0;0;0;0;0;0;0;1;0;0;0;0;0;0;0;0;0;0;0;0;1;0;1;0;0;0;0;0;
Modifié le 28 nov. 2023 à 13:35
Oui ça marche. Quelques explications :
- t1 mémorise les futurs noms de ligne.
- Plus précisément associe à chaque couple (MRBTS, date) -les futurs noms de lignes- un compteur (qui n'est pas réellement exploité par la suite).
- L'intérêt principal, c'est que si un nom de ligne apparaît plusieurs fois, il n'est pas réinséré dans t1 (on ne fait qu'incrémenter le compteur correspondant déjà présent dans t1). Ainsi on est sûr de ne mémoriser chaque nom de ligne qu'une et une seule fois.
- En pratique, les éléments insérés sont stockés dans leur ordre d'apparition. Au final, t1 est plutôt utilisé comme une liste sans doublons et dont les éléments sont triés selon leur ordre d'insertion. Mais attention, ce genre d'astuce ne marcherait pas dans la plupart des langages.
- t2 associe stocke selon le même princope chaque futur nom de colonne. Le compteur ne sert également à rien.
- t associe à chaque couple (nom_de_ligne, nom_de_colonne), c'est donc une matrice (creuse) qui stocke les compteurs mis en jeu dans le tableau final.
Mais ceci dit, quelques points sont étranges.
- Dans le message de départ #0 il n'était pas question de conserver les dates pour identifier les lignes.
- J'avoue ne pas comprendre pourquoi cette implémentation marche chez toi si celle que je t'ai proposé dans #2 bloquait pour de gros fichiers, car tu stockes plutôt plus d'information.
Bonne continuation
5 déc. 2023 à 16:08
Bonjour Mamiemando ,
Merci bcp le détails d'explications.
une dernière question : est il possible de faire un recap par type items devant chaque ligne?
par exemple un recap à la fin de chaque ligne comme encadré en rouge
Merci d'avance
5 déc. 2023 à 16:21
Oui. Dans le programme proposé dans #11, il faut étoffer la boucle dans laquelle tu écris tes lignes de tableau (l16).
- À chaque nouvelle itération de ligne (l12), il te suffit de créer une chaîne vide (disons s).
- À chaque itération de colonne, quand x est non nul (l18), tu ajoutes le nom de la valeur de x et le nom de la colonne courante (n2) à la suite de s.
- Quand ta ligne de valeur est écrite, tu écris s et tu passes à la ligne (l21)
Normalement avec ça, tu as tout en main pour finaliser.
8 déc. 2023 à 09:33
Bonjour Mamiemando,
Merci infiniment pour votre support je vais m'y mettre et faire un retour.
8 déc. 2023 à 15:40
Bonjour Ghislino,
- Ok :-)
- Si tu es bloqué, n'hésite pas ouvrir un nouveau fil de discussion, en y adjoignant ton code actuel, un fichier de données minimal, et le résultat attendu (car le problème initial est résolu).
Bonne continuation
15 nov. 2023 à 13:50
Bonjour Dubcek,
Non l'ordre n'est pas important
Merci beaucoup pour ton aide.