[AWK] nombre d'occurrences d'un mot

Bonjour,

J'aimerais avec AWK, lors de la lecture d'un fichier en entrée, trouver le nombre d'occurrences d'un mot qui se repète d'une ligne à une autre uniquement et si possible afficher le résultat de 2 façons

° Exemple de fichier
Thomas
Thomas
Thomas
Bernard
Bernard
Bernard
Marie
Marie
Marie
Marie
Marie
Thomas
Joel
Joel

° 1er résultat
Thomas = 3
Bernard = 3
Marie = 5
Thomas = 1
Joel = 2

° 2eme résultat
Thomas = 3
Thomas = 3
Thomas = 3
Bernard = 3
Bernard = 3
Bernard = 3
Marie = 5
Marie = 5
Marie = 5
Marie = 5
Marie = 5
Thomas = 1
Joel = 2
Joel = 2

Merci de vos suggestions.
Configuration: Windows XP
Internet Explorer 6.0

3 réponses

  1. Modérateur
    Ceci devrait faire l'affaire:
    
    johand@osiris:~/src/awk$ cat data.txt 
    Thomas
    Thomas
    Thomas
    Bernard
    Bernard
    Bernard
    Marie
    Marie
    Marie
    Marie
    Marie
    Thomas
    Joel
    Joel
    johand@osiris:~/src/awk$ cat count.awk
    {
        frequencies[$1]++;
    }
    END {
        for (name in frequencies)
    	printf "%s\t%d\n" , name ,frequencies[name];
    }
    johand@osiris:~/src/awk$ awk -f count.awk < data.txt 
    Thomas	4
    Bernard	3
    Joel	2
    Marie	5
    
    3
    1. Modérateur
      Salut jisisv,

      C'est pas bon ;-((

      C'est le nombre d'occurrences consécutives qu'il veut, pas le total, ce fut trop simple autrement ;-))
       while read line; do echo -e "$line = "$(grep -c $line fich); done < fich | sort -u
      0
  2. Modérateur
    Et pour le second affichage
    
    johand@osiris:~/src/awk$ cat count.awk
    BEGIN{
        cnt=0;
    }
    {
        if (frequencies[$1] == 0 )
        {
    	names[cnt++] = $1;
        }
        frequencies[$1]++;
    
    }
    END {
        for (name in frequencies)
        {
    	printf "%s\t%d\n" , name ,frequencies[name];
        }
        print "--------------AFFICHAGE 2------------------";
        for (i=0; i < cnt; i++)
        {
    	for (j=1; j <= frequencies[names[i]]; j++)
    	{
    	    printf "%s %d\n" ,  names[i], frequencies[names[i]];
    	}
        }
    }
    
    0
    1. function affichage1 (nom, occurence)
      {
          print nom, occurence
      }
      
      function affichage2 (nom, occurence)
      {
          for (i = 0 ; i < occurence; i++)
      	print nom, "=", occurence
      }
      
      NR == 1 {store = $1; occurence=1;} # initialisation
      NR != 1 { 
          if ( store == $1) 
      	occurence++;
          else {
      	affichage2(store, occurence) # changer suivant affichage voulu
      	store = $1; occurence=1;
          }    
      }
      
      END { affichage2(store, occurence);} # changer ici aussi! 
      
      1
      1. je sais que le problème est assez vieux par rapport à ma réponse, mais je propose ça:

        NR == 1 {ref=$1; cnt=0;} #init

        { if ($1 == ref)
        cnt++;
        else
        {
        printf "%s \t%d\n" , ref, cnt;
        ref=$1
        cnt=1;
        }
        }
        END{
        printf "%s \t%d\n" , ref, cnt;
        }
        0