Reformatar data para unix time stamp na tabela csv

3

Eu tenho um arquivo .csv contendo a data e a hora no formato 01/20/2016 23:53:01 na 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
…

Em SO , encontrei o comando bash

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

que funciona para o que eu quero. Eu agora estou tentando integrar com awk para substituir a primeira coluna. Eu encontrei uma resposta 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 eu tentei me adaptar às minhas próprias entradas. Mas eu tenho recebido uma saída vazia.

    
por Murch 13.02.2016 / 12:22

2 respostas

2

Eu finalmente abaixei a borracha enquanto escrevia a pergunta. Então aqui está a 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 perdendo o " on +%s" e havia uma linha quebrada na minha entrada.

    
por 13.02.2016 / 12:25
2

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

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

Isto assume que o seu shell suporta substituição de processos (ksh93, bash, zsh). Com sh simples, em uma variante Unix que suporta /dev/fd (a maioria faz), você pode usar o shuffling de descritores de arquivo:

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

Tags