Substituindo data por EPOCH na saída da coluna

Substituindo data por EPOCH na saída da coluna

Eu tenho um conjunto de dados assim:

user1 1234 01/01/2020
user2 2345 02/02/2020

Preciso converter a terceira coluna (data) para EPOCH, mantendo o nome de usuário e o número de identificação.

user1 1234 1577862000
user2 2345 1580626800

Consegui fazer a conversão e a impressão funcionarem, mas a nova data está sendo anexada a uma nova linha.

$awk '{print($1,$2)}; system("date -d "$3" +%s")' data
user1 1234
1577862000
user2 2345
1580626800

Como posso fazer com que a nova data da ÉPOCA fique na mesma linha das colunas 1 e 2?

Responder1

printanexa uma nova linha por padrão. Usar printf:

awk '{printf "%s %s ",$1,$2; system("date -d "$3" +%s")}' data

Se um separador de campo de saída especial OFStivesse sido definido, você poderia usar

awk '{printf "%s%s%s%s",$1,OFS,$2,OFS; system("date -d "$3" +%s")}' data

Observe que cada um %srecebe um dos argumentos restantes para printf.

Saída:

user1 1234 1577847600
user2 2345 1580612400

Responder2

Se você possui o GNU awk (também conhecido como gawk), você pode usar sua função de tempo integrada mktime(embora o formato da data de entrada precise de alguma manipulação primeiro):

$ gawk 'split($3,a,"/") {$3 = mktime(sprintf("%04d %02d %02d 00 00 00",a[3],a[2],a[1]))} 1' data
user1 1234 1577854800
user2 2345 1580619600

Alternativamente, Miller fornece um estilo C strptimee strftime:

$ mlr --nidx put '$3 = strftime(strptime($3,"%d/%m/%Y"),"%s")' data
user1 1234 1577854800
user2 2345 1580619600

ou similarmente em Perl, com o módulo Time::Piece:

$ perl -MTime::Piece -alne '
    $t = pop @F; print join " ", @F, Time::Piece->strptime($t,"%d/%m/%Y")->strftime("%s")
  ' data
user1 1234 1577854800
user2 2345 1580619600

informação relacionada