Compter les occurrences de mot dans un fichier texte

31

J'ai un fichier texte contenant des tweets et je dois compter le nombre de fois qu'un mot est mentionné dans le tweet. Par exemple, le fichier contient:

Apple iPhone X is going to worth a fortune
The iPhone X is Apple's latest flagship iPhone. How will it pit against it's competitors?

Et disons que je veux compter combien de fois le mot iPhone est mentionné dans le fichier. Voici donc ce que j'ai essayé.

cut -f 1 Tweet_Data | grep -i "iPhone" | wc -l

cela fonctionne certainement, mais je suis confus à propos de la commande «wc» sous unix. Quelle est la différence si j'essaye quelque chose comme:

cut -f 1 Tweet_Data | grep -c "iPhone"

où -c est utilisé à la place? Ces deux résultats différents dans un grand fichier plein de tweets et je suis confus sur la façon dont cela fonctionne. Quelle méthode est la bonne façon de compter l'occurrence?

Maxxx
la source
cut -f1coupe en fonction des onglets, ce qui ne fait pas grand-chose ici. Êtes-vous sûr que wc -lcela vous donne vraiment le bon nombre? Il en afficherait 2 ici, mais je compte 3 instances de "iPhone".
Jeff Schaller
Autre technique: unix.stackexchange.com/q/39039/117549
Jeff Schaller
Également similaire: unix.stackexchange.com/q/60727/117549
Jeff Schaller

Réponses:

54

Étant donné une telle exigence, j'utiliserais un grep GNU (pour l' -ooption ), puis le passerais wcpour compter le nombre total d'occurrences:

$ grep -o -i iphone Tweet_Data | wc -l
3

En clair grep -c, les données compteront le nombre de lignes qui correspondent, pas le nombre total de mots qui correspondent. L'utilisation de l' -ooption indique à grep de sortir chaque correspondance sur sa ligne, quel que soit le nombre de fois que la correspondance est sur la ligne.

wc -lindique à l' wcutilitaire de compter le nombre de lignes. Après que grep ait placé chaque correspondance dans sa propre ligne, il s'agit du nombre total d'occurrences du mot dans l'entrée.


Si GNU grep n'est pas disponible (ou souhaité), vous pouvez transformer l'entrée avec trpour que chaque mot soit sur sa propre ligne, puis utilisez grep -cpour compter:

$ tr '[:space:]' '[\n*]' < Tweet_Data | grep -i -c iphone
3
Jeff Schaller
la source
1

La méthode la plus simple est,

grep -wc "your_text" FileName

pour toi ce sera,

grep -wc "iPhone" Tweet_Data
Spectateur silencieux
la source
Réponse très claire cependant, si vous faites correspondre un mot comme «cool», vous ne ferez que correspondre à cool et non à cocooll, alors sachez que les espaces autour du mot comptent.
jasonleonhard
1
Le résultat sera incorrect lorsque le mot apparaît plus d'une fois sur une ligne.
hek2mgl