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?
bash
command-line
grep
json
mythz
fuente
fuente
{ "key": "the key" }
debe contar la cadenakey
una o dos veces.Respuestas:
Donde
tr
reemplaza espacios con líneas nuevas,grep
filtra todas las líneas resultantes que coinciden con WORD ywc
cuenta las restantes.Incluso se puede guardar la
wc
parte utilizando la-c
opción de grep:La
-c
opción 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
tr
partes alternativas sono
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 WORD en los marcadores de inicio / fin de línea:
Lo que es equivalente a los marcadores de inicio / fin de palabra, en nuestro contexto:
fuente
tr
comando que haga el trabajo en lugar de sugerir ejemplos que nunca funcionarán en todas las situaciones. También coincidirá con palabras que contengan la palabra que está buscando. Lagrep -o '\<WORD\>' | wc -l
solución es muy superior.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 comienzo 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,
fuente
grep -wo WORD | wc -l
Esto desafortunadamente no funciona con GNU
coreutils
.Si funciona en su plataforma, es una solución elegante y bastante intuitiva; pero la gente de GNU todavía está pensando.
fuente
grep
tiene un error aquí. Desde POSIX no está claro cuál es la semántica de combinar-c
y-o
debería ser, por lo que actualmente no es portátil. Gracias por el comentario; He actualizado esta respuesta.Este comando hace lo siguiente:
Por ejemplo, si quiero analizar el primer mensaje de Linus Torvald:
Creo un archivo llamado linus.txt , pego el contenido y luego escribo en la consola:
La salida sería:
Si desea visualizar solo las primeras 20 palabras:
Es importante tener en cuenta que el comando tr 'AZ' 'a-z' no se suport UTF-8 sin embargo , de modo que en las lenguas extranjeras la palabra APRÈS se traducirían como après.
Si solo desea buscar la aparición de una palabra, puede agregar un grep al final:
En un script llamado search_freq :
El script debe llamarse:
fuente
sed: -e expression #2, char 7: unterminated
s 'comando', también esto cuenta todas las palabras, ¿verdad? Pero OP solo preguntó una en particular. También un poco de explicación sería bueno.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:
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:
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), ogrep -c -w -F 'WORD'
(para hacer coincidir una palabra en las claves o valores), ogrep -c -x -F 'WORD'
(para hacer coincidir una clave o valor completo), o similar, para Haz tu recuento.fuente
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
fuente
He usado el siguiente comando awk para encontrar el número de ocurrencias
archivo de ejemplo
gato archivo1
mando:
salida
fuente
awk '{sum+=gsub("praveen","")} END {print sum+0}'
.