Respostas:
$ tr ' ' '\n' < FILE | grep WORD | wc -l
Onde tr
substitui espaços por novas linhas, grep
filtra todas as linhas resultantes que correspondem a WORD e wc
conta as restantes.
Pode-se até salvar a wc
peça usando a -c
opção grep:
$ tr ' ' '\n' < FILE | grep -c WORD
A -c
opção é definida pelo POSIX.
Se não for garantido que haja espaços entre as palavras, você precisará usar outro caractere (como delimitador) para substituir. Por exemplo, tr
peças alternativas são
tr '"' '\n'
ou
tr "'" '\n'
se você deseja substituir aspas simples ou duplas. Obviamente, você também pode usar tr
para substituir vários caracteres ao mesmo tempo (pense em diferentes tipos de espaço em branco e pontuação).
Caso você precise contar WORD, mas não o prefixoWORD, WORDsuffix ou prefixWORDsuffix, é possível incluir o padrão WORD nos marcadores de início / fim de linha:
grep -c '^WORD$'
O que é equivalente aos marcadores de início / fim de palavra, em nosso contexto:
grep -c '\<WORD\>'
tr
comando que faça o trabalho, em vez de sugerir exemplos que nunca funcionarão em todas as situações. Também corresponderá às palavras que contêm a palavra que você está procurando. A grep -o '\<WORD\>' | wc -l
solução é muito superior.
Com o GNU grep, isso funciona: grep -o '\<WORD\>' | wc -l
-o
imprime cada parte correspondente de cada linha em uma linha separada.
\<
afirma o início de uma palavra e \>
o final de uma palavra (semelhante ao Perl \b
), para garantir que você não esteja correspondendo a uma string no meio de uma palavra.
Por exemplo,
$ python -c 'importa isso' | grep '\ <um \>' Deve haver uma - e de preferência apenas uma - maneira óbvia de fazê-lo. Os namespaces são uma ótima idéia - vamos fazer mais! $ python -c 'importa isso' | grep -o '\ <one \>' um um um $ python -c 'importe isso' | grep -o '\ <um \>' | wc -l 3
grep -wo WORD | wc -l
Infelizmente, isso não funciona com o GNU coreutils
.
grep -o -c WORD file
Se funcionar na sua plataforma, é uma solução elegante e bastante intuitiva; mas o pessoal do GNU ainda está pensando.
grep
tem um bug aqui. Não está claro no POSIX qual a semântica da combinação -c
e -o
deve ser, portanto isso atualmente não é portátil. Obrigado pelo comentário; Eu atualizei esta resposta.
sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl
Este comando faz o seguinte:
Por exemplo, se eu quiser analisar a primeira mensagem de Linus Torvald:
De: torvalds@klaava.Helsinki.FI (Linus Benedict Torvalds) Grupos de notícias: comp.os.minix Assunto: O que você mais gostaria de ver no minix? Resumo: pequena pesquisa para o meu novo sistema operacional ID da mensagem: <1991Aug25.205708.9541@klaava.Helsinki.FI> Data: 25 de agosto de 91 20:57:08 GMT Organização: Universidade de Helsinque
Olá pessoal, usando o minix -
Estou fazendo um sistema operacional (gratuito) (apenas um hobby, não será grande e profissional como o GNU) para 386 (486) clones AT. Isso está em produção desde abril e está começando a ficar pronto. Gostaria de receber algum feedback sobre coisas que as pessoas gostam / não gostam no minix, pois meu sistema operacional se assemelha um pouco (mesmo layout físico do sistema de arquivos (devido a razões práticas) entre outras coisas).
Atualmente, eu portado bash (1.08) e gcc (1.40), e as coisas parecem funcionar. Isso implica que vou conseguir algo prático dentro de alguns meses e gostaria de saber quais recursos a maioria das pessoas gostaria. Todas as sugestões são bem-vindas, mas não prometo que as implementarei 🙂
Linus (torvalds@kruuna.helsinki.fi)
PS. Sim - é livre de qualquer código minix e possui um fs multiencadeado. NÃO é protegível (usa 386 alternância de tarefas etc.) e provavelmente nunca suportará nada além de discos rígidos AT, pois é tudo o que tenho :-(.
Crio um arquivo chamado linus.txt , colo o conteúdo e depois escrevo no console:
sed -e 's/[^[:alpha:]]/ /g' linus.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl
A saída seria:
1 7 i
2 5 to
3 5 like
4 5 it
5 5 and
6 4 minix
7 4 a
8 3 torvalds
9 3 of
10 3 helsinki
11 3 fi
12 3 any
13 2 would
14 2 won
15 2 what
16 ...
Se você deseja visualizar apenas as 20 primeiras palavras:
sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl | head -n 20
É importante notar que o comando tr 'AZ' 'a-z' não suport UTF-8 ainda , de modo que em línguas estrangeiras o apres palavra seria traduzido como Apres.
Se você deseja pesquisar apenas a ocorrência de uma palavra, pode adicionar um grep no final:
sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl | grep "\sword_to_search_for$"
Em um script chamado search_freq :
#!/bin/bash
sed -e 's/[^[:alpha:]]/ /g' text_to_analize.txt | tr '\n' " " | tr -s " " | tr " " '\n'| tr 'A-Z' 'a-z' | sort | uniq -c | sort -nr | nl | grep "\s$1$"
O script deve ser chamado:
search_freq word_to_search_for
sed: -e expression #2, char 7: unterminated
s 'command`, também conta todas as palavras, certo? Mas a OP pediu apenas uma em particular. Também um pouco de explicação seria bom.
Dependendo se você deseja corresponder a palavra nas chaves ou nos valores dos dados JSON, é provável que você deseje extrair apenas chaves ou apenas valores dos dados. Caso contrário, você poderá contar algumas palavras muitas vezes se elas ocorrerem como chaves e valores.
Para extrair todas as chaves:
jq -r '..|objects|keys[]' <file.json
Isso testa recursivamente se a coisa atual é um objeto e, se for, extrai as chaves. A saída será uma lista de chaves, uma por linha.
Para extrair todos os valores:
jq -r '..|scalars' <file.json
Isso funciona de maneira semelhante, mas possui menos etapas.
Você pode canalizar a saída acima através grep -c 'PATTERN'
(para corresponder algum padrão às chaves ou valores), ou grep -c -w -F 'WORD'
(para corresponder a uma palavra nas chaves ou valores), ou grep -c -x -F 'WORD'
(para corresponder a uma chave ou valor completo), ou similar, a faça a sua contagem.
Eu tenho json com algo assim: "number":"OK","number":OK"
repetido várias vezes em uma linha.
Meu contador "OK" simples:
sed "s|,|\n|g" response | grep -c OK
Eu usei o comando awk abaixo para encontrar o número de ocorrências
arquivo de exemplo
file1 gato
praveen ajay
praveen
ajay monkey praveen
praveen boy praveen
comando:
awk '{print gsub("praveen",$0)}' file1 | awk 'BEGIN{sum=0}{sum=sum+$1}END{print sum}'
resultado
awk '{print gsub("praveen",$0)}' file1 | awk 'BEGIN{sum=0}{sum=sum+$1}END{print sum}'
5
awk '{sum+=gsub("praveen","")} END {print sum+0}'
.
{ "key": "the key" }
deve contar a sequênciakey
uma ou duas vezes.