Usando o que você já sabe:
- O GNU
date
pode converter um registro de data e hora em uma data formatada, fornecendo @timestamp
.
- A substituição de espaços por
|
fornecerá a saída desejada.
Para isso, adicionamos
- O GNU
date
pode operar em um arquivo, convertendo datas em um lote.
Para converter em lote datas com o GNU date
, temos que extrair os registros de tempo e prefixá-los com @
:
$ sed 's/^\([^ ]*\).*$/@/' data.in
@1137921146.499
@1137921158.698
@1137921758.163
@1137921802.016
A expressão sed
substitui cada linha pelo primeiro campo delimitado por espaço, prefixado com @
.
Com bash
(e ksh93
, ou qualquer shell que entenda substituições de processos):
$ date -f <( sed 's/^\([^ ]*\).*$/@/' data.in )
Sun Jan 22 10:12:26 CET 2006
Sun Jan 22 10:12:38 CET 2006
Sun Jan 22 10:22:38 CET 2006
Sun Jan 22 10:23:22 CET 2006
Em seguida, precisamos pegar os outros campos dos dados de entrada e substituir os delimitadores:
$ cut -d ' ' -f 2- data.in | tr ' ' '|'
180900|61.153.158.197|1409
181622|61.153.158.197|1409
180026|221.226.124.114|1374
179485|121.13.128.132|1409
Em seguida, colamos essas duas coisas juntas com um |
como delimitador:
$ paste -d '|' <( date -f <( sed 's/^\([^ ]*\).*$/@/' data.in ) ) <( cut -d ' ' -f 2- data.in | tr ' ' '|' )
Sun Jan 22 10:12:26 CET 2006|180900|61.153.158.197|1409
Sun Jan 22 10:12:38 CET 2006|181622|61.153.158.197|1409
Sun Jan 22 10:22:38 CET 2006|180026|221.226.124.114|1374
Sun Jan 22 10:23:22 CET 2006|179485|121.13.128.132|1409