Bash One Liners #3
Em Bash One Liners #2 apresentei uma combinação de programas Linux para construirmos um ranking dos meses com mais artigos publicados em um blog. Com um pouco mais de esforço podemos calcular o somatório e a média de artigos publicados durante a vida do blog. É o que vamos ver agora.
Vamos começar com o seguinte arquivo (o ranking do meu blog antes de postar este artigo):
14 Fevereiro 2008
12 Novembro 2007
9 Janeiro 2008
8 Setembro 2007
7 Junho 2008
6 Dezembro 2007
5 Outubro 2007
5 Maio 2008
3 Março 2008
2 Julho 2007
2 Agosto 2007
1 Abril 2008
Supondo que esse conteúdo esteja no arquivo `ranking’, o seguinte one liner nos dá o total de artigos publicados:
awk '{ sum += $1 } END { print sum }' ranking
E para termos a média:
awk '{ sum += $1 } END { print sum / NR }' ranking
Nem precisamos de pipes desta vez. No primeiro script utilizamos
a variável sum para armazenar o somatório da primeira coluna
de dados do arquivo. O awk não se incomoda com variáveis não
inicializadas, e é isso que nos permite fazer a totalização com
um único comando. A cláusula END é especial, pois é executada
apenas quando todas as linhas do arquivo já foram avaliadas. Para
programas como esse que geram relatórios, essa é a parte ideal
para imprimir o rodapé ou algum tipo de totalização. É exatamente
isso que fazemos.
O segundo script é idêntico ao primeiro, com a exceção de que imprime
a divisão do somatório pela quantidade de linhas analisadas. Na verdade
NR, quando utilizado fora da cláusula END, guarda sempre o
número da linha corrente, mas como estamos
dentro de END ela guarda o número da última linha lida, que é exatamente
o total de linhas analisadas.