Duas variações:
- Faça um loop sobre os arquivos e invoque
awkuma vez para cada arquivo ou - Dê ao script
awktodos os arquivos e deixe-o calcular a média de cada um e o relatório conforme for avançando.
A classificação do resultado de qualquer uma das soluções abaixo pode ser feita pipetando sua saída por meio de
sort -k2,2rn
Isso faz uma classificação numérica inversa no segundo campo (as médias).
Primeira solução:
#!/bin/sh
for name in "$1"/*.dat; do
test -f "$name" || continue # skip non-files
awk -F '>' '/<Overall>/ { s+=$NF; n++ } END { print FILENAME, s/n }' "$name"
done
Este script espera um nome de diretório na linha de comando como o primeiro e único argumento de linha de comando. O script awk encontrará todas as linhas que contêm a string Overall e resumirá (em s ) o valor após o > nessa linha. No final, a média é gerada junto com o nome do arquivo. A variável n contém o número de vezes que adicionamos algo a s .
Segunda solução (requer o GNU Awk):
#!/bin/sh
find "$1" -maxdepth 1 -type f -name '*.dat' \
-exec awk -F '>' '/<Overall>/ { s+=$NF; n++ } ENDFILE { print FILENAME, s/n; s=n=0 }' {} +
Esse script, como o primeiro, espera um nome de diretório como seu único argumento de linha de comando. Ele usa find para executar um script awk com o máximo de .dat de arquivos possível no momento.
O script awk faz uso do gatilho ENDFILE do GNU Awk para gerar os valores calculados e redefinir as variáveis s e n depois de processar cada arquivo, antes de começar a ler o próximo arquivo.
Isso também pode ter sido escrito como
#!/bin/sh
awk -F '>' '/<Overall>/ { s+=$NF; n++ } ENDFILE { print FILENAME, s/n; s=n=0 }' "$1"/*.dat
mas isso depende de "$1"/*.dat não ser expandido para uma lista muito longa de nomes de arquivos (isso também requer que cada nome .dat seja um arquivo regular, que é algo que o comando find acima garante com -type f ) .