Recap d'items avec AWK

Résolu
GHISLINO Messages postés 214 Date d'inscription lundi 25 juillet 2011 Statut Membre Dernière intervention 8 décembre 2023 - 13 nov. 2023 à 15:50
mamiemando Messages postés 33113 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 mai 2024 - 8 déc. 2023 à 15:40

Bonjour à tous,

J'ai un fichier File1 et je souhaiterais obtenir un fichier recap sous forme de tableau comme le fichier File2.

Merci d'avance. 

File1

20230221;MRBTS-16093;FHDB;1M174421709
20230221;MRBTS-16093;AHMA;1M210208749
20230221;MRBTS-16093;AHMA;1M210208718
20230221;MRBTS-16093;AHMA;1M210208747
20230221;MRBTS-16093;FSMF;AS180404427
20230221;MRBTS-16093;FBBC;EA210920304
20230221;MRBTS-16093;FBBA;F7173104353
20230221;MRBTS-16093;FHDB;1M173662723
20230221;MRBTS-16093;FHDB;1M174421372
20230221;MRBTS-16157;FSMF;AS174834345
20230221;MRBTS-16157;FHDB;1M174749008
20230221;MRBTS-16157;FHDB;1M174421463
20230221;MRBTS-16157;FHDB;1M174748338
20230221;MRBTS-16157;FRGY;K9173601399
20230221;MRBTS-16157;FRGY;K9173601407
20230221;MRBTS-16157;FRGY;K9173601400
20230221;MRBTS-16157;FXED;F7181404539
20230221;MRBTS-16157;FBBC;AS175023605
20230221;MRBTS-16157;ARMA;1M210201972
20230221;MRBTS-16157;FSMF;L1210103299
20230221;MRBTS-16157;FBBC;AS180233082
20230221;MRBTS-16171;FSMF;AS180308589
20230221;MRBTS-16171;FBBA;F7173058213
20230221;MRBTS-16171;FHDB;1M174749022
20230221;MRBTS-16171;FHDB;1M172155559
20230221;MRBTS-16171;FHDB;1M174748885
20230221;MRBTS-16171;ARMA;1M210123469
20230221;MRBTS-16171;FBBC;EA210920591

File2

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;;3;1;1
MRBTS-16171;3;0;1;1;1;0;0;1


Windows / Chrome 119.0.0.0

7 réponses

dubcek Messages postés 18724 Date d'inscription lundi 15 janvier 2007 Statut Contributeur Dernière intervention 15 mai 2024 5 615
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 ?

0
GHISLINO Messages postés 214 Date d'inscription lundi 25 juillet 2011 Statut Membre Dernière intervention 8 décembre 2023
15 nov. 2023 à 13:50

Bonjour Dubcek,

Non l'ordre n'est pas important

Merci beaucoup pour ton aide.

0
mamiemando Messages postés 33113 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 mai 2024 7 753
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

0
GHISLINO Messages postés 214 Date d'inscription lundi 25 juillet 2011 Statut Membre Dernière intervention 8 décembre 2023
15 nov. 2023 à 13:49

Bonjour Mamiemando,

Merci beaucoup pour ton aide

0
GHISLINO Messages postés 214 Date d'inscription lundi 25 juillet 2011 Statut Membre Dernière intervention 8 décembre 2023
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
0
mamiemando Messages postés 33113 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 mai 2024 7 753
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

0
GHISLINO Messages postés 214 Date d'inscription lundi 25 juillet 2011 Statut Membre Dernière intervention 8 décembre 2023 > mamiemando Messages postés 33113 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 mai 2024
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/.

0
mamiemando Messages postés 33113 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 mai 2024 7 753 > GHISLINO Messages postés 214 Date d'inscription lundi 25 juillet 2011 Statut Membre Dernière intervention 8 décembre 2023
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 ?

0
GHISLINO Messages postés 214 Date d'inscription lundi 25 juillet 2011 Statut Membre Dernière intervention 8 décembre 2023
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?
[...]
0
mamiemando Messages postés 33113 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 mai 2024 7 753
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...

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
GHISLINO Messages postés 214 Date d'inscription lundi 25 juillet 2011 Statut Membre Dernière intervention 8 décembre 2023
Modifié 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;
0
mamiemando Messages postés 33113 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 mai 2024 7 753
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

0
GHISLINO Messages postés 214 Date d'inscription lundi 25 juillet 2011 Statut Membre Dernière intervention 8 décembre 2023
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

0
mamiemando Messages postés 33113 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 mai 2024 7 753
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.

0
GHISLINO Messages postés 214 Date d'inscription lundi 25 juillet 2011 Statut Membre Dernière intervention 8 décembre 2023
8 déc. 2023 à 09:33

Bonjour Mamiemando,

Merci infiniment pour votre support je vais m'y mettre et faire un retour.

0
mamiemando Messages postés 33113 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 15 mai 2024 7 753
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

0