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.