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
Permissão para desligar o sistema
Otimizar o mascaramento NAT
Conversão de arquivos EBCDIC para ASCII
Leitura recomendada
Sistema de backup em shell script
Formas de Obter as Dimensões do Emulador Terminal
Substituir espaços em branco por underlines em nome de arquivos
Resolvendo problemas ao montar SMBFS
Letras Bacanas no seu Shell Script sem Figlet
Comentários
Nenhum comentário foi encontrado.