[AWK] nombre d'occurrences d'un mot

Fermé
sparc5 - 25 sept. 2008 à 14:52
 jenaipas - 11 mai 2009 à 17:37
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.

3 réponses

jisisv
Messages postés
3645
Date d'inscription
dimanche 18 mars 2001
Statut
Modérateur
Dernière intervention
15 janvier 2017
956
25 sept. 2008 à 15:44
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
jipicy
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
25 sept. 2008 à 17:00
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
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
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
jisisv
Messages postés
3645
Date d'inscription
dimanche 18 mars 2001
Statut
Modérateur
Dernière intervention
15 janvier 2017
956
25 sept. 2008 à 16:15
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