[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Expressão Regular para formatar log
From: |
andelnyr |
Subject: |
Re: Expressão Regular para formatar log |
Date: |
Mon, 11 Oct 2010 16:53:54 -0000 |
User-agent: |
eGroups-EW/0.82 |
Prezado Cristiano
Desculpe a demora em lhe agradecer a sua sugestão para a solução do problema
que apresentei aqui na lista, mas só agora que eu via sua resposta.
Interessantíssima a sua sugestão e estou testando um script modificado com ela
nesse momento.
Logo mais eu posto o resultado.
Abraços
>
> Caro andelnyr,
>
> O que você precisa é transpor linhas para colunas.
>
> Analisando o seu exemplo de arquivo, percebi que há um padrão que pode ser
> usado como delimitado dos registro do seu arquivo.
>
> Cada novo registro começa com um "h " seguido da hora no formato hh:mm:ss.
>
> Se realmente for assim, dois comandinhos resolvem seu problema: csplit e
> paste.
>
> O csplit é parecido com o split, mas ao invés de quebrar o arquivo com base
> em uma medida fixa, quebra quando encontra uma linha com determinado padrão
> (regex). Para cada ocorrência do padrão ele criar um arquivo novo com o nome
> em xx00, onde 00 vai crescendo à medida que novos arquivos vão sendo criados.
>
> Depois de dividir o arquivo em vários, um para cada registro (faça isso
> preferencialmente em um diretório vazio), basta juntá-los com paste.
>
> Seu arquivo tem linhas antes de começar os registro que você provavelmente
> irá querer tratar antes de fazer o que estou sugerindo.
>
> Eu simplifiquei o seu exemplo para isto:
>
> $ cat teste.txt
> titulo_coluna1
> titulo_coluna2
> titulo_coluna3
> titulo_coluna145
> h 00:00:00
> valor_coluna1
> valor_coluna2
> valor_coluna3
> valor_coluna145
> h 00:05:00
> valor_coluna1
> valor_coluna2
> valor_coluna3
> valor_coluna145
> h 00:10:00
> valor_coluna1
> valor_coluna2
> valor_coluna3
> valor_coluna145
>
> Como o exemplo é simples e toda linha começa com "h", simplifiquei a regex
> para pegar tudo que começa com "h", mas você pode melhorá-la. Então, o
> comando ficou assim:
>
> $ csplit teste.txt '/^h/' {*}
> 62
> 69
> 69
> 69
>
> Os números que você vê como retorno do csplit (62,69,69,69) são a quantidade
> de bytes que contém cada novo arquivo. Veja o resultado:
>
> $ ls
> pateste.txt xx00 xx01 xx02 xx03
>
> Ele criou os arquivos xx00 a xx03, com o seguinte conteúdo:
>
> $ head -99 xx*
> ==> xx00 <==
> titulo_coluna1
> titulo_coluna2
> titulo_coluna3
> titulo_coluna145
>
> ==> xx01 <==
> h 00:00:00
> valor_coluna1
> valor_coluna2
> valor_coluna3
> valor_coluna145
>
> ==> xx02 <==
> h 00:05:00
> valor_coluna1
> valor_coluna2
> valor_coluna3
> valor_coluna145
>
> ==> xx03 <==
> h 00:10:00
> valor_coluna1
> valor_coluna2
> valor_coluna3
> valor_coluna145
>
> Viu, agora você tem um arquivo (xx00) com cabeçalho das colunas e, um
> registro por arquivo.
>
> Finalizando, junte tudo com o paste.
>
> $ paste -s x* > paste.txt
> $ cat paste.txt
> titulo_coluna1 titulo_coluna2 titulo_coluna3 titulo_coluna145
> h 00:00:00 valor_coluna1 valor_coluna2 valor_coluna3
> valor_coluna145
> h 00:05:00 valor_coluna1 valor_coluna2 valor_coluna3
> valor_coluna145
> h 00:10:00 valor_coluna1 valor_coluna2 valor_coluna3
> valor_coluna145
>
> Os títulos não batem com as colunas, pq não há titulo no arquivo original
> para a coluna das horas. Basta acertar isso depois.
>
> Ajudou?
>
- Re: Expressão Regular para formatar log,
andelnyr <=