[AWK] nombre d'occurrences d'un mot

sparc5 -  
 jenaipas -
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. jisisv Messages postés 3678 Statut Modérateur 936
     
    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. jipicy Messages postés 40842 Date d'inscription   Statut Modérateur Dernière intervention   4 898
       
      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. mc
     
    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. jenaipas
       
      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
  3. jisisv Messages postés 3678 Statut Modérateur 936
     
    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