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
Otimizar o mascaramento NAT
Permissão para desligar o sistema
Conversão de arquivos EBCDIC para ASCII
Leitura recomendada
Iniciando automaticamente o Firestarter com o modo gráfico sem senha
Comentando várias linhas em scripts bash
Removendo linhas duplicadas de um arquivo texto
Sistema de backup em shell script
mailx não envia cópia carbono nem cópia carbono oculta [RESOLVIDO]
Comentários
Nenhum comentário foi encontrado.