Como faço para contar o número de ocorrências de uma palavra em um arquivo de texto com a linha de comando?

31

Eu tenho um grande arquivo JSON 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 posso fazer isso?

    
por mythz 19.09.2010 / 17:51

6 respostas

36
$ tr ' ' '\n' < FILE | grep WORD | wc -l

Onde tr substitui espaços por novas linhas, grep filtra todas as linhas resultantes que correspondem ao WORD e wc conta as restantes.

Pode-se até salvar a parte wc usando a opção -c do grep:

$ tr ' ' '\n' < FILE | grep -c WORD

A opção -c é definida por POSIX.

Se não for garantido que há espaços entre as palavras, você precisará usar algum outro caractere (como delimitador) para substituir. Por exemplo, tr partes alternativas são

tr '"' '\n'

ou

tr "'" '\n'

se você quiser substituir aspas duplas ou simples.

Caso você precise contar o WORD, mas não o prefixoWORD, WORDsuffix ou prefixoWORDsuffix, você pode colocar o padrão WORD em marcadores de início / fim de palavras:

grep -c '\<WORD\>'
    
por 19.09.2010 / 17:52
18

Com o GNU grep, isso funciona: grep -o '\<WORD\>' | wc -l

-o imprime cada parte correspondente de cada linha em uma linha separada.

\< confirma o início de uma palavra e \> confirma o final de uma palavra (semelhante ao \b de Perl), portanto, isso garante que você não esteja combinando uma string no meio de uma palavra. / p>

Por exemplo,

$ python -c 'import this' | grep '\<one\>'
There should be one-- and preferably only one --obvious way to do it.
Namespaces are one honking great idea -- let's do more of those!
$ python -c 'import this' | grep -o '\<one\>'
one
one
one
$ python -c 'import this' | grep -o '\<one\>' | wc -l
3
    
por 19.09.2010 / 23:06
8

Isso infelizmente não funciona com o GNU coreutils .

grep -o -c WORD file

Se funciona na sua plataforma, é uma solução elegante e razoavelmente intuitiva; mas as pessoas do GNU ainda estão pensando.

    
por 02.02.2013 / 21:47
6
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:

  1. Substitua todos os caracteres não alfanuméricos por um espaço em branco.
  2. Todas as quebras de linha são convertidas em espaços também.
  3. Reduz todos os vários espaços em branco para um espaço em branco
  4. Todos os espaços agora são convertidos em quebras de linha. Cada palavra em uma linha.
  5. Traduz todas as palavras para minúsculas para evitar que 'Olá' e 'olá' sejam palavras diferentes
  6. Classifica o texto
  7. Conta e remove as linhas iguais
  8. Ordena reversa para contar as palavras mais frequentes
  9. Adicione um número de linha a cada palavra para saber a palavra posotion em todo

Por exemplo, se eu quiser analisar a primeira mensagem de Linus Torvald:

From: [email protected] (Linus Benedict Torvalds) Newsgroups: comp.os.minix Subject: What would you like to see most in minix? Summary: small poll for my new operating system Message-ID: <[email protected]> Date: 25 Aug 91 20:57:08 GMT Organization: University of Helsinki

Hello everybody out there using minix –

I’m doing a (free) operating system (just a hobby, won’t be big and professional like gnu) for 386(486) AT clones. This has been brewing since april, and is starting to get ready. I’d like any feedback on things people like/dislike in minix, as my OS resembles it somewhat (same physical layout of the file-system (due to practical reasons) among other things).

I’ve currently ported bash(1.08) and gcc(1.40), and things seem to work. This implies that I’ll get something practical within a few months, and I’d like to know what features most people would want. Any suggestions are welcome, but I won’t promise I’ll implement them

por 26.12.2016 / 22:12
1

Dependendo se você deseja corresponder a palavra nas chaves ou nos valores dos dados JSON, é provável que você queira extrair apenas as chaves ou apenas os 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 recursivamente testa 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 tem menos etapas.

Você pode, então, canalizar a saída acima através de grep -c 'PATTERN' (para corresponder a alguns padrões em relação às chaves / valores) ou grep -c -w -F 'WORD' (para corresponder a uma palavra nas chaves / valores) ou grep -c -x -F 'WORD' (para combinar uma chave / valor completo), ou similar, para fazer sua contagem.

    
por 18.10.2018 / 13:19
0

Eu tenho o 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

    
por 06.09.2018 / 10:03