for file in "$1" executará o loop exatamente uma vez, com file definido para o valor literal do primeiro argumento para o script. Como "$1" é citado, os curingas não são expandidos. Se você passar um diretório para o script, também passará o nome do diretório para awk , e provavelmente não vai gostar muito disso, meu gawk diz:
gawk: warning: command line argument '/tmp/test/' is a directory: skipped
Se você deseja executar o loop sobre cada arquivo individualmente, use um caractere curinga no local correto. O * aqui será expandido para os nomes de arquivos no diretório atual, aquele dado como argumento, já que fizemos um cd lá:
#!/bin/sh
cd "$1" || exit 1
for file in * ; do
awk '...' "$file"
done
Como alternativa, você pode passar uma lista de nomes de arquivos como argumento para o script e, em seguida, fazer um loop sobre eles:
#!/bin/sh
for file in "$@" ; do
awk '...' "$file"
done
Na prática, você faria myscript /some/path/hotel*.dat e deixaria o shell expandir os nomes dos arquivos para a linha de comando dos scripts. "$@" se expande para a lista de argumentos da linha de comando.
Dito isto, o script awk está um pouco fora também. Conforme você escreveu, a condição para a primeira regra é count+=sub(/<Overall>/, "") . Isso é verdade sempre que count for diferente de zero após a adição, independentemente de qual sub() retornou dessa vez. Isso significa que a regra {sum+=$0} é executada toda vez que <Overall> é visto pelo menos uma vez. Será somado sem aumentar count .
Você provavelmente vai querer algo assim:
awk '/^<Overall>/ {sub(/<Overall>/, ""); count += 1; sum += $0} END {print sum/count}' "$file"
Para exibir o nome do arquivo, você pode echo it:
#!/bin/sh
cd "$1" || exit 1
for file in * ; do
printf "%s " "$file"
awk '/^<Overall>/ {sub(/<Overall>/, ""); count += 1; sum += $0} END {print sum/count}' "$file"
done