Selecionando registros de um arquivo texto com o awk
Precisei fazer um shell script onde deveria selecionar alguns registros (linhas) de um arquivo texto com base em determinada data e hora. Utilizei o awk e achei muito interessante, vejam como o utilizei:
Conteúdo do arquivo texto chamado id01.txt:
10/01/2006 01:05:50 771.000000
10/01/2006 01:06:50 773.000000
10/01/2006 01:07:50 774.000000
10/01/2006 01:08:50 773.000000
10/01/2006 01:09:50 771.000000
10/01/2006 01:10:51 769.000000
10/01/2006 01:11:51 768.000000
10/01/2006 01:12:51 767.000000
10/01/2006 01:13:51 769.000000
10/01/2006 01:14:51 772.000000
10/01/2006 01:15:51 774.000000
10/01/2006 01:16:51 774.000000
10/01/2006 01:17:51 773.000000
10/01/2006 01:18:51 771.000000
10/01/2006 01:19:51 769.000000
10/01/2006 01:20:51 767.000000
10/01/2006 01:21:52 768.000000
10/01/2006 01:22:52 771.000000
10/01/2006 01:23:52 773.000000
As colunas são: data, hora e temperatura.
Para selecionar os registros do dia 10/01/2006, entre 01:10:00 h e 01:20:00 h, por exemplo, podemos usar o awk da seguinte forma:
# awk '$1$2 >= "10/01/200601:10:00" && $1$2 <= "10/01/200601:20:59"' id01.txt
Que produzirá o seguinte resultado:
10/01/2006 01:10:51 769.000000
10/01/2006 01:11:51 768.000000
10/01/2006 01:12:51 767.000000
10/01/2006 01:13:51 769.000000
10/01/2006 01:14:51 772.000000
10/01/2006 01:15:51 774.000000
10/01/2006 01:16:51 774.000000
10/01/2006 01:17:51 773.000000
10/01/2006 01:18:51 771.000000
10/01/2006 01:19:51 769.000000
10/01/2006 01:20:51 767.000000
Algumas explicações:
O awk funciona assim: awk ' [padrão] [{ação}] '.
Perceba que ambos os parâmetros são opcionais e dentro de aspas simples. Caso a ação não seja especificado o padrão é a exibição de toda a linha lida (entenda linha como a seqüência de caracteres até o encontro de um "Enter" ou carriage-return). Caso o padrão não seja especificado, todas as linhas do arquivo sofrerão a ação especificada.
Veja também que, como queria verificar dois valores, juntei as variáveis $1 e $2 ($1$2) e NÃO acrescentei espaço no conteúdo a ser comparado ("10/01/200601:10:00).
Para imprimir apenas a terceira coluna, no exemplo acima, basta acrescentar a ação {print $3}, assim:
# awk ' $1$2 >= "10/01/200601:10:00" && $1$2 <= "10/01/200601:20:59" {print $3} ' id01.txt
Em tempo, o && significa "e" e o || significa "ou".
O awk é muito poderoso, e imagino que para aqueles que ainda não o conhecem e saibam programar que a dica acima poderá ser útil e um incentivo a conhecê-lo um pouco mais profundamente.
Outras dicas deste autor
Conversão de arquivos EBCDIC para ASCII
Permissão para desligar o sistema
Otimizar o mascaramento NAT
Leitura recomendada
Renomeando extensões de centenas de arquivos de uma só vez
Comentando várias linhas em scripts bash
MIDI, Timidity e Rosegarden no Kurumin: Solução definitiva
Instalar o Unity 3D Web Player no Linux
Tornando o Wget interativo via linha de comando
Comentários
Nenhum comentário foi encontrado.