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_countcorrespondente a 0.
☛ Observe que
BEGINFILEenextfilenã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 (critters) e conte as linhas que combinam com elas. - Ao atingir o
ENDde 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.