it-swarm-es.tech

¿Cómo cuento el número de apariciones de una palabra en un archivo de texto con la línea de comando?

Tengo un archivo JSON grande que está en una línea, y quiero usar la línea de comando para poder contar el número de apariciones de una palabra en el archivo. ¿Cómo puedo hacer eso?

45
mythz
$ tr ' ' '\n' < FILE | grep Word | wc -l

Donde tr reemplaza espacios con nuevas líneas, grep filtra todas las líneas resultantes que coinciden con Word y wc cuenta las restantes.

Incluso se puede guardar la parte wc usando la opción -c De grep:

$ tr ' ' '\n' < FILE | grep -c Word

La opción -c Está definida por POSIX.

Si no se garantiza que haya espacios entre las palabras, debe usar algún otro carácter (como delimitador) para reemplazar. Por ejemplo, las partes alternativas tr son

tr '"' '\n'

o

tr "'" '\n'

si desea reemplazar comillas dobles o simples. Por supuesto, también puede usar tr para reemplazar varios caracteres a la vez (piense en diferentes tipos de espacios en blanco y puntuación).

En caso de que necesite contar Word pero no prefixWORD, WORDsuffix o prefixWORDsuffix, puede encerrar el patrón de Word en los marcadores de inicio/fin de línea:

grep -c '^Word$'

Lo que es equivalente a los marcadores de inicio/fin de Word, en nuestro contexto:

grep -c '\<Word\>'
48
maxschlepzig

Con GNU grep, esto funciona: grep -o '\<Word\>' | wc -l

-o imprime cada parte coincidente de cada línea en una línea separada.

\< afirma el inicio de una palabra y \> afirma el final de una palabra (similar a la de Perl \b), por lo que esto garantiza que no coincida una cadena en el medio de una palabra.

Por ejemplo,

PS python -c 'importar esto' | grep '\ <one \>' 
 Debería haber uno- y preferiblemente solo uno - forma obvia de hacerlo. 
 Los espacios de nombres son uno tocando la bocina gran idea - ¡hagamos más de eso! 
PS python -c 'importar esto' | grep -o '\ <one \>' 
unounounoPS python -c 'importar esto' | grep -o '\ <one \>' | wc -l 
 3 
25
ephemient

Esto desafortunadamente no funciona con GNU coreutils.

grep -o -c Word file

Si funciona en su plataforma, es una solución elegante y bastante intuitiva; pero los GNU la gente todavía está pensando.

11
tripleee
sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " |  tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl 

Este comando hace lo siguiente:

  1. Sustituya todos los caracteres no alfanuméricos con un espacio en blanco.
  2. Todos los saltos de línea también se convierten en espacios.
  3. Reduce todos los espacios en blanco múltiples a un espacio en blanco
  4. Todos los espacios ahora se convierten en saltos de línea. Cada palabra en una línea.
  5. Traduce todas las palabras a minúsculas para evitar que 'Hola' y 'hola' sean palabras diferentes
  6. Clases de texto
  7. Cuenta y elimina las líneas iguales
  8. Ordena en reversa para contar las palabras más frecuentes
  9. Agregue un número de línea a cada palabra para conocer la posición de la palabra en su totalidad.

Por ejemplo, si quiero analizar el primer mensaje de Linus Torvald:

De: [email protected] (Linus Benedict Torvalds) Grupos de noticias: comp.os.minix Asunto: ¿Qué le gustaría ver más en minix? Resumen: pequeña encuesta para mi nuevo sistema operativo ID de mensaje: <[email protected]> Fecha: 25 de agosto 91 20:57:08 GMT Organización: Universidad de Helsinki

Hola a todos por ahí usando minix -

Estoy haciendo un sistema operativo (gratuito) (solo un hobby, no será grande y profesional como gnu) para 386 (486) AT clones. Esto se ha estado gestando desde abril, y está empezando a prepararse. Me gustaría recibir comentarios sobre cosas que a la gente le gustan/disgustan en minix, ya que mi sistema operativo se parece un poco (el mismo diseño físico del sistema de archivos (por razones prácticas), entre otras cosas).

Actualmente porté bash (1.08) y gcc (1.40), y las cosas parecen funcionar. Esto implica que obtendré algo práctico dentro de unos meses, y me gustaría saber qué características desearía la mayoría de las personas. Cualquier sugerencia es bienvenida, pero no prometo implementarla.

Linus ([email protected])

PD. Sí, está libre de cualquier código minix y tiene una fs multiproceso. NO es protable (utiliza el cambio de tareas 386, etc.), y probablemente nunca admitirá nada más que discos duros AT, ya que eso es todo lo que tengo : .

Creo un archivo llamado linus.txt , pego el contenido y luego escribo en la consola:

sed -e 's/[^[:alpha:]]/ /g' linus.txt | tr '\n' " " |  tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl 

La salida sería:

 1        7 i
 2        5 to
 3        5 like
 4        5 it
 5        5 and
 6        4 minix
 7        4 a
 8        3 torvalds
 9        3 of
10        3 helsinki
11        3 fi
12        3 any
13        2 would
14        2 won
15        2 what
16        ...

Si desea visualizar solo las primeras 20 palabras:

sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " |  tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl | head -n 20

Es importante tener en cuenta que el comando tr 'AZ' 'a-z' no admite UTF-8 --- (todavía , para que en idiomas extranjeros la palabra APRÈS se traduzca como aprÈs.

Si solo desea buscar la aparición de una palabra, puede agregar un grep al final:

sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " |  tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl | grep "\sword_to_search_for$"

En un script llamado search_freq :

#!/bin/bash
sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " |  tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl | grep "\s$1$"

El script debe llamarse:

 search_freq Word_to_search_for
7
Roger Borrell

Dependiendo de si desea hacer coincidir la palabra en las claves o en los valores de los datos JSON, es probable que desee extraer solo claves o solo valores de los datos. De lo contrario, puede contar algunas palabras demasiadas veces si aparecen como claves y valores.

Para extraer todas las claves:

jq -r '..|objects|keys[]' <file.json

Esto prueba de forma recursiva si lo actual es un objeto y, si lo es, extrae las claves. La salida será una lista de claves, una por línea.

Para extraer todos los valores:

jq -r '..|scalars' <file.json

Esto funciona de manera similar, pero tiene menos pasos.

Luego puede canalizar la salida de lo anterior a través de grep -c 'PATTERN' (para hacer coincidir algún patrón con las claves o valores), o grep -c -w -F 'Word' (para que coincida con un Word en las claves o valores), o grep -c -x -F 'Word' (para que coincida con una clave o valor completo), o similar, para contar.

3
Kusalananda

Tengo json con algo como esto: "number":"OK","number":OK" repetido varias veces en una línea.

Mi simple contador "OK":

sed "s|,|\n|g" response | grep -c OK

0
khazad-dum_miner

Utilizando grep -c contará solo las líneas, una línea podría tener muchas apariciones de la Palabra.

Esto lo haría:

grep -o Word foo|wc -l
0
Ramiro Velazquez