Contar ocorrências de um caractere no arquivo de texto sem formatação

132

Existe alguma maneira no linux / terminal para contar, quantas vezes o char f ocorre em um arquivo de texto sem formatação?

cupakob
fonte
9
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.

Cascabel
fonte
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:

real   0m0.522s
user   0m0.477s
sys    0m0.023s 
user1985553
fonte
3
Para contar vários personagens, por exemplo a, be c: tr -cd abc < file | wc -l.
Skippy le Grand Gourou
você tem certeza? não deveria ser em tr -cd abc < file | wc -cvez disso
Mithun B
10
echo $(cat <file>  | wc -c) - $(cat <file>  | tr -d 'A' | wc -c) | bc

onde o A é o personagem

Hora para este comando com um arquivo com 4,9 MB e 1100000 ocorrências do caractere pesquisado:

real   0m0.168s
user   0m0.059s
sys    0m0.115s
Vereb
fonte
1
Isso fica um terço mais rápido se você remover cats desnecessários , fornecendo o nome do arquivo como argumento para wce tr.
Cascabel
1
Se você realmente deseja otimizar isso, leia o arquivo apenas uma vez: echo $ (stat -c% s <arquivo>) - $ (cat <arquivo> | tr -d 'A' | wc -c) | bc
Vereb
@Vereb - tr só lê stdin, mas que pode ser canalizada em vez de cated:tr -d 'A' < <file> | wc ...
DSZ
7

Se tudo o que você precisa fazer é contar o número de linhas que contêm seu personagem, isso funcionará:

grep -c 'f' myfile

No entanto, conta várias ocorrências de 'f' na mesma linha que uma única correspondência.

Jongo, o Gibão
fonte
4

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 linhas
  • sed 's/A/A\n/g: adiciona uma nova linha após cada ocorrência de "A"
  • wc -l: conta o número de linhas

Exemplo:

$ cat file
abcdefgabcdefgababababbbba


1234gabca

$ tr -d '\n' < file | sed 's/a/a\n/g' | wc -l
9
Rob Hruska
fonte