Eu tenho um arquivo JSON grande que está em uma linha e quero usar a linha de comando para poder contar o número de ocorrências de uma palavra no arquivo. Como eu posso fazer isso?
bash
command-line
grep
json
mythz
fonte
fonte
{ "key": "the key" }
deve contar a sequênciakey
uma ou duas vezes.Respostas:
Onde
tr
substitui espaços por novas linhas,grep
filtra todas as linhas resultantes que correspondem a WORD ewc
conta as restantes.Pode-se até salvar a
wc
peça usando a-c
opção grep: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ãoou
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:
O que é equivalente aos marcadores de início / fim de palavra, em nosso contexto:
fonte
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. Agrep -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,
fonte
grep -wo WORD | wc -l
Infelizmente, isso não funciona com o GNU
coreutils
.Se funcionar na sua plataforma, é uma solução elegante e bastante intuitiva; mas o pessoal do GNU ainda está pensando.
fonte
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.Este comando faz o seguinte:
Por exemplo, se eu quiser analisar a primeira mensagem de Linus Torvald:
Crio um arquivo chamado linus.txt , colo o conteúdo e depois escrevo no console:
A saída seria:
Se você deseja visualizar apenas as 20 primeiras palavras:
É 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:
Em um script chamado search_freq :
O script deve ser chamado:
fonte
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:
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:
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), ougrep -c -w -F 'WORD'
(para corresponder a uma palavra nas chaves ou valores), ougrep -c -x -F 'WORD'
(para corresponder a uma chave ou valor completo), ou similar, a faça a sua contagem.fonte
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
fonte
Eu usei o comando awk abaixo para encontrar o número de ocorrências
arquivo de exemplo
file1 gato
comando:
resultado
fonte
awk '{sum+=gsub("praveen","")} END {print sum+0}'
.