Tecnicamente, isso pode ser considerado um sh / bash / etc. questão de programação, então eu acho que tem validade em qualquer lugar.
21430 Rob Hruska
@Rob Hruska: sim, eu também acho que é programação do bash ... @abrashka: a resposta para sua primeira e segunda pergunta é "NÃO"!
22249 cupakob
Respostas:
178
Que tal agora:
fgrep -o f <file> | wc -l
Nota: Além de muito mais fácil de lembrar / duplicar e personalizar, isso é cerca de três vezes (desculpe, edite! Estragou o primeiro teste) mais rápido que a resposta de Vereb.
Este não funciona se você precisar contar \rou \ncaracteres; a tr -cd fresposta funciona para isso.
bjnord
3
Para contar vários personagens, por exemplo a, be c, use egrep: egrep -o 'a|b|c' <file> | wc -l.
Skippy le Grand Gourou
Além disso, tome cuidado para NÃO usar wc -ccomo na trresposta: como grepgera linha por linha, wccontaria o final de linhas como caracteres (dobrando o número de caracteres).
Skippy le Grand Gourou
@bjnord Ok \r, mas para contar, \npor que não usar wc -l?
Skippy le Grand Gourou
67
Ainda mais rápido:
tr -cd f < file | wc -c
Hora para este comando com um arquivo com 4,9 MB e 1100000 ocorrências do caractere pesquisado:
real 0m0.089s
user 0m0.057s
sys 0m0.027s
Tempo de resposta Vereb com echo, cat, tre bcpara o mesmo arquivo:
real 0m0.168s
user 0m0.059s
sys 0m0.115s
Tempo para Rob Hruska resposta com tr, sede wcpara o mesmo arquivo:
real 0m0.465s
user 0m0.411s
sys 0m0.080s
Hora da resposta do Jefromi com fgrepe wcpara o mesmo arquivo:
Respostas:
Que tal agora:
Nota: Além de muito mais fácil de lembrar / duplicar e personalizar, isso é cerca de três vezes (desculpe, edite! Estragou o primeiro teste) mais rápido que a resposta de Vereb.
fonte
\r
ou\n
caracteres; atr -cd f
resposta funciona para isso.a
,b
ec
, useegrep
:egrep -o 'a|b|c' <file> | wc -l
.wc -c
como natr
resposta: comogrep
gera linha por linha,wc
contaria o final de linhas como caracteres (dobrando o número de caracteres).\r
, mas para contar,\n
por que não usarwc -l
?Ainda mais rápido:
Hora para este comando com um arquivo com 4,9 MB e 1100000 ocorrências do caractere pesquisado:
Tempo de resposta Vereb com
echo
,cat
,tr
ebc
para o mesmo arquivo:Tempo para Rob Hruska resposta com
tr
,sed
ewc
para o mesmo arquivo:Hora da resposta do Jefromi com
fgrep
ewc
para o mesmo arquivo:fonte
a
,b
ec
:tr -cd abc < file | wc -l
.tr -cd abc < file | wc -c
vez dissoonde o A é o personagem
Hora para este comando com um arquivo com 4,9 MB e 1100000 ocorrências do caractere pesquisado:
fonte
cat
s desnecessários , fornecendo o nome do arquivo como argumento parawc
etr
.stdin
, mas que pode ser canalizada em vez decat
ed:tr -d 'A' < <file> | wc ...
Se tudo o que você precisa fazer é contar o número de linhas que contêm seu personagem, isso funcionará:
No entanto, conta várias ocorrências de 'f' na mesma linha que uma única correspondência.
fonte
tr -d '\n' < file | sed 's/A/A\n/g' | wc -l
Substituindo as duas ocorrências de "A" pelo seu caractere e "arquivo" pelo seu arquivo de entrada.
tr -d '\n' < file
: remove novas linhassed 's/A/A\n/g
: adiciona uma nova linha após cada ocorrência de "A"wc -l
: conta o número de linhasExemplo:
fonte