Organizando dados com shell script

Muitas vezes você pode ter uma grande quantidade de arquivos contendo dados e deseja organizá-las, de modo que cada linha corresponda a informação obtida em um determinado horário. Geralmente os algoritmos desenvolvidos buscam um melhor desempenho da máquina apoiando-se em padrões como nomes de arquivos, ordenamento de datas utilizando dia do ano e número de segundos desde uma determinada data, etc.

Caso os dados estejam realmente uma bagunça, aqui segue um algoritmo inverso: data e horário são criados em uma string que é buscada em toda a base de dados, copiando as linhas encontradas para um novo arquivo; um comando em awk apaga as linhas duplicadas sem alterar a ordem (ou seja, sem utilizar o comando “sort”). É bem mais demorado computacionalmente (por isso inclui um comando juntando toda a informação em um único arquivo, para não precisar ficar abrindo e fechando arquivos para leitura), mas é uma opção caso não possa contar com uma melhor organização na base de dados.

Esse outro script tem a função de calcular médias a cada cinco minutos com eventuais falhas na sequência de dados. É composto de duas funções: “coloca_zero”, que deixa dia, hora e minuto com dois dígitos, e “calcula_media”, que calcula a média coluna por coluna (usando “bc“) e monta a linha a ser impressa no arquivo. Essa média envolve os valores obtidos nos cinco minutos anteriores; por exemplo, dos minutos 55, 56, 57, 58 e 59 a média será representada no minuto 00 da hora (ou dia, se for o caso) seguinte.

Atualizações: Incluída a opção de corrigir os dados conforme o fuso horário (por exemplo, em São Paulo, para passar de hora UTC para HLE, usar fuso=-3). E também segue uma alternativa à função coloca_zero(): mes=expr $m + 0; mes_zero=printf "%02d" $mes . A respeito do comando cut, usar “-f2” imprime só a segunda coluna, enquanto que “-f2-” (com um traço depois) imprime todas as colunas da segunda para frente.

O algoritmo grava todos os dados em um mesmo arquivo. Para separar em arquivos diários, segue a rotina “separa_dias.sh”:

Por último, caso precise substituir os valores de NaN (not a number) por -999 (por exemplo), utilize:

Segue também um outro script para fazer o inverso: criar um arquivo para cada data (se essa data existir) a partir de um arquivo com várias linhas de diferentes horários e dias.

Algo que facilita a vida nesse arquivo é que os dias estão em “dia do ano”.

Extra sobre o comando sort

Esse comando serve para montar uma lista a partir dos registros da 1ª coluna de um arquivo, sem repetições:

Pode ser útil para identificar quais são os sensores que estão em um mesmo arquivo, por exemplo. Para organizar todas as linhas e colunas com uma coluna como referência, sue o parâmetro “-k” seguido do número da coluna de referência (começando de 1, da esquerda para a direita).