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?

cupakob
fuente
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.

Cascabel
fuente
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 
usuario1985553
fuente
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
Vereb
fuente
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.

Jongo the Gibbon
fuente
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
Rob Hruska
fuente