Reformate a data para carimbo de data / hora unix na tabela csv

Reformate a data para carimbo de data / hora unix na tabela csv

Tenho um .csvarquivo contendo a data e hora no formato 01/20/2016 23:53:01da primeira coluna. Minhas colunas são separadas por ponto e vírgula, ou seja

01/21/2016 03:03:01;18616;0;1
01/21/2016 03:13:01;29040;36553;2

SobreENTÃOEu encontrei o comando bash

date -d '06/12/2012 07:21:22' +"%s" 

que funciona para o que eu quero. Agora estou tentando integrar awkpara substituir a primeira coluna. Eu encontrei umresposta para um problema semelhante:

awk -F'"' -v OFS='"'  '$8 {cmd="date -d \""$8"\" +%FT%T%z"; cmd | getline $8; close(cmd)} 1' input.json

Que tentei adaptar às minhas próprias informações. Mas estou recebendo uma saída vazia.

Responder1

Finalmente consegui me esquivar enquanto escrevia a pergunta. Então aqui está minha solução:

awk -F';' -v OFS=';'  '$1 {cmd="date -d \""$1"\" +%s"; cmd | getline $1; close(cmd)} 1' datetime.csv > unix.csv

Foi a combinação de duas coisas: eu estava faltando "e +%s"havia uma linha quebrada na minha entrada.

Responder2

A data GNU tem a -fopção de converter datas lidas de um arquivo, linha por linha. Se o seu arquivo for longo, será mais rápido do que invocar dateuma vez por linha. A data precisa ficar sozinha na linha; portanto, o plano é isolar a primeira coluna ( cut -d \; -f 1), executá-la date -f -para realizar a conversão ecolaro resultado com as colunas restantes.

paste -d \; <(<input cut -d \; -f 1 | date -f - +%s) <(<input cut -d \; -f 2-)

Isso pressupõe que seu shell suportesubstituição de processo(ksh93, bash, zsh). Com plain sh, em uma variante Unix compatível /dev/fd(a maioria suporta), você pode usar o embaralhamento do descritor de arquivo:

<input cut -d \; -f 2- | {
  exec 3<&0
  <input cut -d \; -f 1 | date -f - +%s | paste -d \; - /dev/fd/3
}

Responder3

Hummm. Ok, isso foi há um tempo, mas acho que posso dar uma sugestão.

Tenho quase certeza de que entrar no shell para chamar "data" para cada linha do seu arquivo pode ser um pouco lento se você tiver muitas linhas.

Eu iria usar um script que escrevi para processar entradas de quadro de horários, extraídas do Google Agenda, e gerar algum HTML para depois converter em uma fatura em PDF. Mas então demorou muito para falar sobre isso. Então vou apenas passar o código para você economizar na leitura.

Estou usando as funções AWK gensub e mktime [https://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html]. A função mktime espera a entrada no formato datespec "AAAA MM DD HH MM SS [DST]" portanto, sua entrada precisa ser alterada em torno de onde entra a função gensub. Aqui está o que tenho para você...

awk -F';' -v OFS=';' '{ $1=mktime(gensub(/(..)\/(..)\/(....) (..):(..):(..)/, "\\3 \\1 \\2 \\4 \\5 \\6", 1, $1)); } 1' datetime.csv > unix.csv

Eu faria isso de maneira um pouco diferente e imprimiria os argumentos individuais em uma impressão, em vez de escrever de volta ao primeiro argumento. Um pouquinho mais de autodocumentação ;) TIMTOWTDI

awk -F';' -v OFS=';' '{ print mktime(gensub(/(..)\/(..)\/(....) (..):(..):(..)/, "\\3 \\1 \\2 \\4 \\5 \\6", 1, $1)), $2, $3, $4; }' datetime.csv > unix.csv

Eu sei que o script é um pouco mais detalhado, mas espero que tenha melhor desempenho.

Espero que ajude você ou qualquer outra pessoa que esteja olhando para a mesma coisa.

informação relacionada