Uma coisa legal de dar uma nova roupagem a um antigo projeto é ganhar um gás para escrever sobre assuntos que achávamos que já não tínhamos mais tanto a oferecer.
E vou lhes dizer que é muito legal ganhar esta gás e poder voltar a postar sobre coisas que só nós que somos nerds e apaixonados com TI sabemos valorizar.
E uma destas coisas é o famoso awk. O awk é uma ferramenta que está em todos os sistemas operacionais baseados em Unix no planeta e é praticamente uma linguagem de programação, sendo possível a partir dela gerar coisa para caramba. Em geral, a maioria das pessoas utiliza o parser que ele tem para filtragem de strings ( posso dizer hoje que 80% do meu uso do awk é para este tipo de aplicação ) mas ele vai bem além.
Lendo hoje meus feeds no meu kindle dei de cara com uma aplicação bem legal do awk. Na realidade o script abaixo pega o número e cria uma dupla com o múltiplo mais próximo de 10 em números aleatoriamente gerados.
`while true ; do echo $[ 1 + $[ RANDOM % 100 ]] ; done | head -100 | awk '{ bucket = int(($1 + 5) / 10) * 10 ; arr[bucket]++} END { for (i in arr) {print i, arr[i] }}' | sort -k2n,2 -k1n,1
`
Infelizmente muita gente não curte esta idéia de uma linha ( que normalmente é como criamos alguns scripts para resolver problemas quando temos somente uma console disponível ) e gosta de visualizar o script identado e mais claro.
Para estes segue o script acima mais acabadinho e fácil de ser visualizado.
#!/bin/bashwhile true ; do
echo $[ 1 + $[ RANDOM % 100 ]]
done | head -100 | \
awk '
{
bucket = int(($1 + 5) / 10) * 10 ;
arr[bucket]++
}
END {
for (i in arr) {
print i, arr[i]
}
}
' | sort -k2n,2 -k1n,1
A saída vai ser mais ou menos igual esta aqui.
$ sh algo.sh 0 2 50 7 10 8 60 8 80 8 20 9 100 9 40 11 70 11 30 12 90 15
Uma outra coisa interessante que pouca gente sabe é que o awk pode criar funções. Sim, você pode criar funções em awk que podem ser utilizadas em outros scripts.
É algo que eu descobri muito tempo depois de conhecer o awk, mas agora o mesmo script acima em função que pode ser utilizada em outros programas ( uma das boas coisas da programação, funções que podem ser reaproveitadas ).
Lembrando que o awk lê estas funções e é só usar a flag -v para utilizar .
Como o autor do script hoje em dia gosto mais de usar python para estes fins mas o awk realmente se mostrou bem interessante neste caso específico, nem que seja somente para conhecer mais alguma utilidade para o awk :)