Contando ocurrencias de palabras en archivos de texto

31

Tengo un archivo de texto que contiene tweets y debo contar la cantidad de veces que se menciona una palabra en el tweet. Por ejemplo, el archivo contiene:

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?

Y digamos que quiero contar cuántas veces se menciona la palabra iPhone en el archivo. Así que esto es lo que he intentado.

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

Ciertamente funciona, pero estoy confundido sobre el comando 'wc' en Unix. ¿Cuál es la diferencia si intento algo como:

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

donde se usa -c en su lugar? Ambos producen resultados diferentes en un archivo grande lleno de tweets y estoy confundido sobre cómo funciona. ¿Qué método es la forma correcta de contar la ocurrencia?

Maxxx
fuente
cut -f1es cortar basado en pestañas, que no está haciendo mucho aquí. ¿Estás seguro de que wc -lrealmente te está dando el recuento correcto? Mostraría 2 aquí, pero cuento 3 instancias de "iPhone".
Jeff Schaller
Otra técnica: unix.stackexchange.com/q/39039/117549
Jeff Schaller
También similar: unix.stackexchange.com/q/60727/117549
Jeff Schaller

Respuestas:

54

Dado tal requisito, usaría un grep de GNU (para la -oopción ), luego lo pasaría wcpara contar el número total de ocurrencias:

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

Los grep -cdatos simples contarán el número de líneas que coinciden, no el número total de palabras que coinciden. Usar la -oopción le dice a grep que muestre cada coincidencia en su línea, sin importar cuántas veces la coincidencia esté en la línea.

wc -lle dice a la wcutilidad que cuente el número de líneas. Después de que grep coloca cada coincidencia en su propia línea, este es el número total de apariciones de la palabra en la entrada.


Si GNU grep no está disponible (o no lo desea), puede transformar la entrada trpara que cada palabra esté en su propia línea, luego use grep -cpara contar:

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

El método más fácil es

grep -wc "your_text" FileName

para ti será,

grep -wc "iPhone" Tweet_Data
Espectador silencioso
fuente
Respuesta muy limpia, sin embargo, si está haciendo coincidir una palabra como 'cool', solo coincidirá con cool y NO ccooll, así que tenga en cuenta que los espacios alrededor de la palabra importan.
jasonleonhard
1
El resultado será incorrecto cuando la palabra aparezca más de una vez en una línea.
hek2mgl