No exemplo dado, que eu acho que é simplificado para clareza pedagógica, você está certo de que é supérfluo. Você poderia obter os mesmos resultados sem usar BEGIN
.
1 == NR { print "Files found:\n" }
/\<[a|x].*\.conf$/ { print $9 }
produziria os mesmos resultados, já que a instrução print está restrita a apenas a primeira linha de entrada.
Dito isto, os blocos BEGIN
e END
são ferramentas incrivelmente poderosas. Como outras soluções mencionaram, você pode usar o bloco BEGIN
para inicializar variáveis ou outras rotinas que precisam ser executadas apenas uma vez, mas também podem ser usadas para executar comandos do awk quando não houver arquivos para processar. Um exemplo simples:
BEGIN { print sqrt(12/4) }
Você pode ver um exemplo mais sério de programação no Awk sem processar nenhuma entrada aqui .
Da mesma forma, o bloco END
é extremamente útil para realizar cálculos e resumir toda a entrada. Isso não pode ser feito (geralmente) sem a primeira leitura em todos os dados. Um exemplo simples de resumo de entrada pode ser encontrado aqui