Esta é uma maneira de obter os resultados desejados com o GNU awk
:
awk '
BEGINFILE {
if (FILENAME ~ "^animals/" || FILENAME ~ "/animals/") {
this_name = substr(FILENAME, index(FILENAME,"animals/")+length("animals/"))
i = index(this_name, ".")
if (i > 0) this_name = substr(this_name, 1, i-1)
critter[++num] = this_name
critter_count[num] = 0
nextfile
}
}
{
for (i = 1; i <= num; i++) {
if ($0 ~ critter[i]) critter_count[i]++
}
}
END {
for (i = 1; i <= num; i++) print critter[i] ": " critter_count[i]
}
' animals/* people/*
-
Ao iniciar um novo arquivo (
BEGINFILE
), verifique se o nome começa comanimals/
ou contém/animals/
. Isso permite que você digaanimals/*
,./animals/*
ou~/animals/*
. Se isso acontecer,- Extraia a substring à direita de
animals/
. - Em seguida, procure por
.
; se encontrado, extraia a substring à esquerda dele. - Adicione esta string (o nome do arquivo base, com o diretório e a extensão removidos)
para a matriz
critter[]
, e inicialize ocritter_count
correspondente a 0.
☛ Observe que
BEGINFILE
enextfile
não estão disponíveis no POSIX awk. - Extraia a substring à direita de
- Caso contrário (se estivermos vendo um arquivo
people
), loop pelos nomes dos animais (critter
s) e conte as linhas que combinam com elas. - Ao atingir o
END
de todas as entradas, relatar os nomes dos animais que foram extraídos dos nomes dos arquivosanimals
, e as contagens de quantas vezes apareceram em um arquivopeople
.
Isso não pesquisará o diretório people
recursivamente;
Eu não vi nenhuma afirmação na pergunta que isso foi desejado.