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:
Respuestas:
Qué tal esto:
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.
fuente
\r
o\n
caracteres; latr -cd f
respuesta funciona para eso.a
,b
yc
, utiliceegrep
:egrep -o 'a|b|c' <file> | wc -l
.wc -c
como en latr
respuesta: dado que lasgrep
salidas línea por línea,wc
contarían el final de las líneas como caracteres (por lo tanto, se duplica el número de caracteres).\r
, pero para contar\n
¿por qué no solo usarwc -l
?aun más rápido:
Tiempo para este comando con un archivo con 4.9 MB y 1100000 ocurrencias del carácter buscado:
Tiempo de respuesta Vereb con
echo
,cat
,tr
ybc
para el mismo archivo:Es hora de que Rob Hruska responda con
tr
,sed
ywc
para el mismo archivo:Es hora de que Jefromi responda con
fgrep
ywc
para el mismo archivo:fuente
a
,b
yc
:tr -cd abc < file | wc -l
.tr -cd abc < file | wc -c
en su lugardonde la A es el personaje
Tiempo para este comando con un archivo con 4.9 MB y 1100000 ocurrencias del carácter buscado:
fuente
cat
s innecesarios , dando el nombre de archivo como argumento parawc
ytr
.stdin
, pero eso se puede canalizar en lugar decat
tr -d 'A' < <file> | wc ...
Si todo lo que necesitas hacer es contar la cantidad de líneas que contienen tu personaje, esto funcionará:
Sin embargo, cuenta múltiples ocurrencias de 'f' en la misma línea que una sola coincidencia.
fuente
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íneassed '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íneasEjemplo:
fuente