Decompte de parttern avec awk [Résolu]

Signaler
Messages postés
191
Date d'inscription
lundi 25 juillet 2011
Statut
Membre
Dernière intervention
12 février 2021
-
Messages postés
29583
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
21 février 2021
-
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

Messages postés
29583
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
21 février 2021
7 033
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
Messages postés
191
Date d'inscription
lundi 25 juillet 2011
Statut
Membre
Dernière intervention
12 février 2021

Bonjour Mamiemando,

C est super Merci Beaucoup pour ton coup de main.

Bonne et heureuse année 2021 à tous

Merci encore
Messages postés
29583
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
21 février 2021
7 033 >
Messages postés
191
Date d'inscription
lundi 25 juillet 2011
Statut
Membre
Dernière intervention
12 février 2021

De rien, bonne continuation !