Convertendo segundos de época em tempo inline (de preferência vim, mas a linha de comando seria legal)

2

Eu tenho um arquivo com o formato

47 2013-05-01 1367406011 2 30 15
47 2013-05-01 1367406388 1 29 14
43 2013-05-01 1367407469 1 26 12
42 2013-05-01 1367407489 1 25 11
42 2013-05-01 1367407810 1 24 11
39 2013-05-01 1367409056 1 22 9
41 2013-05-01 1367409610 1 22 9
36 2013-05-01 1367411409 1 22 9
34 2013-05-01 1367412388 1 20 9
32 2013-05-01 1367413208 1 19 9

Onde a terceira coluna é a hora em que a medição foi feita em segundos desde a época. Eu gostaria de poder ver a hora a cada dia, e estou procurando a maneira mais simples de converter todas as colunas no arquivo.

Qual é a maneira mais eficaz de realizar a conversão? (Eu estou no OSX)

    
por Joe 01.05.2013 / 16:10

2 respostas

2

Se você tiver o Perl instalado na máquina em que está fazendo isso e se todas as linhas do arquivo estiverem formatadas de forma idêntica ao exemplo da sua pergunta, a seguinte linha de comando emitirá uma versão do arquivo com tempos do Unix. substituídos por valores legíveis:

cat source-file | perl -pe's@(^\d+ [\d-]+ )(\d+)@$1 . scalar(localtime($2))@e;'

Sou eu mesmo um usuário do Emacs, mas pelo manual do vim, eu pude aplicar esse comando ao conteúdo do seu buffer atual:

1,$!perl -pe's@(^\d+ [\d-]+ )(\d+)@$1 . scalar(localtime($2))@e;'
    
por 01.05.2013 / 17:16
3

No Vim, essa macro rápida faz o trabalho:

qq                           " start recording
0                            " go to first column
2W                           " go to time column
"mciw                        " put time in register m and replace it…
<C-r>=strftime("%T", @m)<CR> " …with localized time
<Esc>                        " exit insert mode
q                            " stop recording

Quando a macro estiver gravada, selecione todas as linhas que você deseja traduzir e faça:

:'<,'>norm @q

Se essas linhas forem intercaladas com outras linhas que você não deseja tocar, você pode usar o comando :g[lobal] para executar a macro somente nas linhas que correspondem a algum padrão:

:g/2013-05/norm @q

Referência:

:h :normal
:h :global

e

:h strftime()

para ideias de formatação de datas.

Com essa macro, sua amostra se torna instantaneamente:

47 2013-05-01 13:00:11 2 30 15
47 2013-05-01 13:06:28 1 29 14
43 2013-05-01 13:24:29 1 26 12
42 2013-05-01 13:24:49 1 25 11
42 2013-05-01 13:30:10 1 24 11
39 2013-05-01 13:50:56 1 22 9
41 2013-05-01 14:00:10 1 22 9
36 2013-05-01 14:30:09 1 22 9
34 2013-05-01 14:46:28 1 20 9
32 2013-05-01 15:00:08 1 19 9
    
por 01.05.2013 / 18:19