Usando um único comando de linha de comando, como eu procuraria cada arquivo de texto em um banco de dados para encontrar as 10 palavras mais usadas?

2

Esta pergunta respondida explica como pesquisar e classificar um nome de arquivo específico, mas como você conseguiria isso para um diretório inteiro? Eu tenho 1 milhão de arquivos de texto que eu preciso para procurar as dez palavras mais usadas.

banco de dados = /data/000/0000000/s##_date/*.txt - / data / 999/0999999 / s ## _ data / * txt

Tudo o que tentei resultou na classificação de nomes de arquivos, caminhos ou erros de diretório.

Eu fiz algum progresso com o grep, mas partes de nomes de arquivos parecem aparecer nos meus resultados.

grep -r . * | tr -c '[:alnum:]' '[\n*]' | sort | uniq -c | sort -nr | head  -10
output:
 1145 
    253 txt
    190 s01
    132 is
    126 of
    116 the
    108 and
    104 test
     92 with
     84 in

O 'txt' e 's01' vêm de nomes de arquivos e não do texto dentro do arquivo de texto. Eu sei que existem maneiras de excluir palavras comuns como "o" mas preferem não classificar e contar os nomes dos arquivos.

    
por dpoiesz 22.01.2018 / 02:36

1 resposta

1

grep mostrará o nome do arquivo de cada arquivo que corresponde ao padrão junto com a linha que contém a correspondência se mais de um arquivo for pesquisado, o que está acontecendo no seu caso.

Em vez de usar grep (que é uma solução lenta mas inspirada para não ser capaz de cat todos os arquivos na linha de comando de uma só vez) você pode realmente cat todos os arquivos de texto e processá-lo como um grande documento como este:

find /data -type f -name '*.txt' -exec cat {} + |
tr -cs '[:alnum:]' '\n' | sort | uniq -c | sort -nr | head

Eu adicionei -s a tr para que várias novas linhas consecutivas sejam compactadas em uma, e eu mudo todas as não-alfanuméricas para novas linhas ( [\n*] fez pouco sentido para mim). O comando head produz dez linhas de saída por padrão, portanto, -10 (ou -n 10 ) não é necessário.

O comando find localiza todos os arquivos regulares ( -type f ) em qualquer lugar abaixo de /data cujos nomes de arquivos correspondem ao padrão *.txt . Para o maior número possível desses arquivos por vez, cat é chamado para concatená-los (isso é o que o -exec cat {} + faz). cat é possivelmente chamado várias vezes se você tiver um grande número de arquivos, mas isso não afeta o restante do pipeline, pois ele lê apenas o fluxo de saída de find + cat .

Para evitar a contagem de linhas vazias, talvez você queira inserir sed '/^ *$/d' antes ou logo após o primeiro sort no pipeline.

    
por 14.02.2018 / 22:30