Decompte de parttern avec awk

Résolu
GHISLINO Messages postés 214 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   -
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

  1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943
     
    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
    1. GHISLINO Messages postés 214 Date d'inscription   Statut Membre Dernière intervention  
       
      Bonjour Mamiemando,

      C est super Merci Beaucoup pour ton coup de main.

      Bonne et heureuse année 2021 à tous

      Merci encore
      0
      1. mamiemando Messages postés 33228 Date d'inscription   Statut Modérateur Dernière intervention   7 943 > GHISLINO Messages postés 214 Date d'inscription   Statut Membre Dernière intervention  
         
        De rien, bonne continuation !
        0