Decompte de parttern avec awk

Résolu/Fermé
GHISLINO Messages postés 214 Date d'inscription lundi 25 juillet 2011 Statut Membre Dernière intervention 8 décembre 2023 - Modifié le 5 févr. 2021 à 10:23
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 - 12 févr. 2021 à 19:23
Bonjour à tous,

Je souhaiterais faire le décompte de plusieurs parttern d'une même ligne avec awk

Fichier de départ :

309 MRBTS-10309 FRGU FXDB FXDB FBBA FBBA FSMF
309 MRBTS-20309 FRMF FXED FBBC FSMF
3090 MRBTS-13090 FHDB FHDB FHDB FBBC FSMF


Fichier de sortie :

309;MRBTS-10309;1FRGU;2FXDB;2FBBA;1FSMF 
309;MRBTS-20309;1FRMF;1FXED;1FBBC;1FSMF
3090;MRBTS-13090;3FHDB;1FBBC;1FSMF

1 réponse

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
Modifié le 5 févr. 2021 à 10:58
Bonjour,

Tu peux utiliser ce script, qui repose sur un tableau associatif (aka dictionnaire ou map selon les langages) :

toto.awk

{
    if (NF >= 3) {
        for (i = 3; i <= NF; i++) {
            dict[$i] += 1;
        }
        s = $1 ";" $2;
        for (key in dict) {
            n = dict[key];
            s = s ";" n key
        }
        print s;
        delete dict;
    }
}


Explication
  • NF
    compte le nombre de champs (fields) dans la ligne courante (
    $0
    ). Chaque field correspond aux valeurs prises par
    $1
    ,
    $2
    , etc.
  • Dans la première boucle
    for
    , on stocke dans
    dict
    pour chaque clé le nombre d'occurrences observées. Si une clé n'existe pas encore, comme en C++, la valeur correspondant est associée à une valeur par défaut (
    0
    dans le cas d'un entier).
  • Ensuite on commence à préparer la chaîne
    s
    qui va contenir la chaîne transformée, en concaténant
    $1
    , la chaîne de caractère ";" et
    $2
    .
  • On itère sur chaque clé du dictionnaire
    key
    et on récupère le compteur associé
    dict[key]
    .
  • Enfin on affiche
    s
    sur la sortie standard


toto.txt

309;MRBTS-10309;1FRGU;2FXDB;1FSMF;2FBBA
309;MRBTS-20309;1FBBC;1FRMF;1FSMF;1FXED
3090;MRBTS-13090;1FBBC;3FHDB;1FSMF


Exécution

awk -f toto.awk toto.txt


Exemple :

(mando@silk) (~) $ awk -f toto.awk toto.txt 
309;MRBTS-10309;1FRGU;2FXDB;1FSMF;2FBBA
309;MRBTS-20309;1FBBC;1FRMF;1FSMF;1FXED
3090;MRBTS-13090;1FBBC;3FHDB;1FSMF


Si tu veux récupérer le contenu dans un fichier, on gère ça à l'appel du script :

awk -f toto.awk toto.txt > toto2.txt


Remarque

Note que les clés sont triés par ordre alphabétiques par
awk
. Le résultat n'est donc pas exactement celui posé dans la question, mais je suppose que ça n'est pas très important...

Bonne chance
0
GHISLINO Messages postés 214 Date d'inscription lundi 25 juillet 2011 Statut Membre Dernière intervention 8 décembre 2023
12 févr. 2021 à 10:00
Bonjour Mamiemando,

C est super Merci Beaucoup pour ton coup de main.

Bonne et heureuse année 2021 à tous

Merci encore
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749 > GHISLINO Messages postés 214 Date d'inscription lundi 25 juillet 2011 Statut Membre Dernière intervention 8 décembre 2023
12 févr. 2021 à 19:23
De rien, bonne continuation !
0