Cuenta las apariciones de un carácter en un archivo de texto sin formato


132

¿Hay alguna manera en Linux / terminal para contar, cuántas veces se produce el char f en un archivo de texto sin formato?


9
Técnicamente esto podría considerarse un sh / bash / etc. pregunta de programación, así que creo que tiene validez en cualquier lugar.
Rob Hruska

@Rob Hruska: sí, también creo que es una programación bash ... @abrashka: ¡la respuesta para su primera y segunda pregunta es "NO"!
cupakob

Respuestas:


178

Qué tal esto:

fgrep -o f <file> | wc -l

Nota: Además de ser mucho más fácil de recordar / duplicar y personalizar, esto es aproximadamente tres veces (lo siento, editar! Falló la primera prueba) más rápido que la respuesta de Vereb.


Este no funciona si necesita contar \ro \ncaracteres; la tr -cd frespuesta funciona para eso.
bjnord

3
Para contar varios caracteres, por ejemplo a, by c, utilice egrep: egrep -o 'a|b|c' <file> | wc -l.
Skippy le Grand Gourou

Además, tenga cuidado de NO usar wc -ccomo en la trrespuesta: dado que las grepsalidas línea por línea, wccontarían el final de las líneas como caracteres (por lo tanto, se duplica el número de caracteres).
Skippy le Grand Gourou

@bjnord Ok \r, pero para contar \n¿por qué no solo usar wc -l?
Skippy le Grand Gourou

67

aun más rápido:

tr -cd f < file | wc -c

Tiempo para este comando con un archivo con 4.9 MB y 1100000 ocurrencias del carácter buscado:

real   0m0.089s
user   0m0.057s
sys    0m0.027s

Tiempo de respuesta Vereb con echo, cat, try bcpara el mismo archivo:

real   0m0.168s
user   0m0.059s
sys    0m0.115s

Es hora de que Rob Hruska responda con tr, sedy wcpara el mismo archivo:

real   0m0.465s
user   0m0.411s
sys    0m0.080s

Es hora de que Jefromi responda con fgrepy wcpara el mismo archivo:

real   0m0.522s
user   0m0.477s
sys    0m0.023s 

3
Para contar varios caracteres, por ejemplo a, by c: tr -cd abc < file | wc -l.
Skippy le Grand Gourou

¿Estás seguro? no se suponía que fuera tr -cd abc < file | wc -cen su lugar
Mithun B

10
echo $(cat <file>  | wc -c) - $(cat <file>  | tr -d 'A' | wc -c) | bc

donde la A es el personaje

Tiempo para este comando con un archivo con 4.9 MB y 1100000 ocurrencias del carácter buscado:

real   0m0.168s
user   0m0.059s
sys    0m0.115s

1
Esto obtiene aproximadamente un tercio más rápido si elimina los cats innecesarios , dando el nombre de archivo como argumento para wcy tr.
Cascabel

1
Si realmente desea optimizar esto, lea el archivo solo una vez: echo $ (stat -c% s <archivo>) - $ (cat <archivo> | tr -d 'A' | wc -c) | bc
Vereb

@Vereb - tr solo lee stdin, pero eso se puede canalizar en lugar de cattr -d 'A' < <file> | wc ...
editar

7

Si todo lo que necesitas hacer es contar la cantidad de líneas que contienen tu personaje, esto funcionará:

grep -c 'f' myfile

Sin embargo, cuenta múltiples ocurrencias de 'f' en la misma línea que una sola coincidencia.


4

tr -d '\n' < file | sed 's/A/A\n/g' | wc -l

Reemplazar las dos ocurrencias de "A" con su personaje y "archivo" con su archivo de entrada.

  • tr -d '\n' < file: elimina nuevas líneas
  • sed 's/A/A\n/g: agrega una nueva línea después de cada aparición de "A"
  • wc -l: cuenta el número de líneas

Ejemplo:

$ cat file
abcdefgabcdefgababababbbba


1234gabca

$ tr -d '\n' < file | sed 's/a/a\n/g' | wc -l
9
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.