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