Ambas as versões do seu código executarão a função small
em todas as linhas do arquivo de entrada. Se você quiser encontrar o menor número no arquivo inteiro, precisará executar a função apenas uma vez e no final, depois que o arquivo inteiro tiver sido processado. Sua função atualizada parece estar funcionando e imprimindo a saída correta três vezes, mas isso ocorre apenas porque o menor número está na primeira linha. Se você executá-lo neste arquivo:
$ cat awk.write
10
9
8
Você receberá esta saída:
awk -f fun.awk awk.write
10
9
8
Isso ocorre porque, toda vez que a função é executada, o número da linha atual é menor do que o que foi salvo, portanto, ela é impressa. Você precisa usar um bloco END{}
e executar a função lá:
function small(){
for(i=1;i<=NR;i++)
{
## If smal is not set or if it is greater than a[i]
if(smal=="" || a[i]<=smal)
smal=a[i]
}
return smal
}
{
## NR is the current line number. This saves the current line
## in the array a.
a[NR]=$0
}
## This will be executed only after everything has been read
END{
print small()
}
Também generalizei para usar NR
em vez de 3
, para que ele possa funcionar em qualquer número de linhas. Você poderia simplificar ainda mais para apenas:
{
if(small=="" || $0<small){
small=$0
}
}
END{print small}
Qual é o mesmo que este one-liner:
awk '(small=="" || $0<small){small=$0}END{print small}' awk.write