Este processo exibe o número de ocorrências de palavras incluídas em arquivos de texto localizados em um diretório ou subdiretórios, para cada arquivo e em todos os arquivos.
- Concatenar todos os arquivos de texto.
- Suprimir palavras duplicadas.
O resultado é uma lista de palavras e cada palavra na lista é contada em cada arquivo sucessivamente, bem como em arquivos concatenados.
- Pesquise o número de ocorrências para cada palavra na lista.
1. Concatenar todos os arquivos de texto
find . -type f -exec cat {} \;
find
pesquisa todos os arquivos de texto no diretório ou nos subdiretórios atuais e invoca cat
para concatenar todos os arquivos correspondentes.
2. Suprimir palavras duplicadas
As palavras podem ser colocadas separadamente em cada linha para criar uma lista de palavras: cada caractere, exceto uma letra, é substituído por uma nova linha e, em seguida, uma sequência de novas linhas é substituída por uma nova linha.
tr -cs '[:alpha:]' '[\n*]'
Finalmente, as palavras duplicadas devem ser suprimidas para obter uma lista adequada de palavras. uniq
pode filtrar linhas repetidas de texto, mas as linhas devem ser classificadas, portanto, sort
pode ser usado para classificar linhas de texto.
sort | uniq
ou
sort -u
Observação: uma pesquisa sem distinção entre maiúsculas e minúsculas pode ser realizada adicionando o seguinte comando no pipeline.
tr '[:upper:]' '[:lower:]'
Problemas potenciais
Um arquivo de script existente não deve ser concatenado com outros arquivos, mesmo se estiver localizado no diretório atual ou em subdiretórios (c.f. man find
).
find . -type f \( \! -name "*${0##*/}" \) -exec cat {} \;
Observação: $0
expande para o nome do shell. ${PARAMETER##WORD}
expande para o parâmetro com o padrão de correspondência mais longo excluído (c.f. expansões de parâmetros do shell).
Por exemplo, /usr/local/bin/myscript
se torna myscript
.
Resultado
list=$(find . -type f \( \! -name "*${0##*/}" \) -exec cat {} \; |
tr -cs '[:alpha:]' '[\n*]' | tr '[:upper:]' '[:lower:]' | sort -u)
A substituição de comandos permite salvar a saída do pipeline em uma variável.
3. Pesquise o número de ocorrências ...
a) Pesquisa todas as linhas contendo a palavra dada, cada ocorrência em uma linha diferente ...
grep --exclude="*${0##*/}" -Rowi $word .
... e conta o número de linhas
grep --exclude="*${0##*/}" -Rowi $word . | wc -l
b) Conta as linhas correspondentes para cada arquivo de entrada.
grep --exclude="*${0##*/}" -Rowi $word . | tr '[:upper:]' '[:lower:]' |
uniq -c | sed -E "$sed_script"
Pesquisa todas as linhas que contêm a palavra em questão (cada ocorrência está em uma linha diferente), imprime o número de ocorrências, bem como o arquivo de origem, e reformata os dados.
Observação: $0
expande para o nome do shell. ${PARAMETER##WORD}
expande para o parâmetro com o padrão de correspondência mais longo excluído (c.f. expansões de parâmetros do shell).
Por exemplo, /usr/local/bin/myscript
se torna myscript
.
Nota: --exclude
é uma extensão GNU, não especificada para POSIX grep . Se isso for um problema, remova a opção e adicione a seguinte instrução na parte superior do script de shell.
# assign first positional parameter to "dirname"
# and move to this directory
dirname=${1:?first positional parameter missing\!}
cd "$dirname"
Script da shell
#!/bin/sh
list=$(find . -type f \( \! -name "*${0##*/}" \) -exec cat {} \; |
tr -cs '[:alpha:]' '[\n*]' | tr '[:upper:]' '[:lower:]' | sort -u)
# extract data and print formatted data
sed_script='s/([[:digit:]]+) (.*):[[:alpha:]]+/:/;s/[[:blank:]]+//'
for word in $list; do
echo $word:$(grep --exclude="*${0##*/}" -Rowi $word . | wc -l)
grep --exclude="*${0##*/}" -Rowi $word . | tr '[:upper:]' '[:lower:]' |
uniq -c | sed -E "$sed_script"
echo
done | sed -e "/^[[:alpha:]]\+:1/{N;N;d;}"
Entrada
prompt% cat file1
Lorem ipsum dolor sit amet. cat cat
prompt% cat file2
Lorem ipsum dolor sit amet, consectetur adipiscing elit. cat ut
prompt% cat file3
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Sed tristique egestas massa sed facilisis. Duis hendrerit ut. cat
tristique tristique tristique tristique
Saída
adipiscing:2
./file2:1
./file3:1
amet:3
./file1:1
./file2:1
./file3:1
cat:4
./file1:2
./file2:1
./file3:1
consectetur:2
./file2:1
./file3:1
dolor:3
./file1:1
./file2:1
./file3:1
elit:2
./file2:1
./file3:1
ipsum:3
./file1:1
./file2:1
./file3:1
lorem:3
./file1:1
./file2:1
./file3:1
sed:2
./file3:2
sit:3
./file1:1
./file2:1
./file3:1
tristique:5
./file3:5
ut:2
./file2:1
./file3:1