
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
print
anexa 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 OFS
tivesse 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 %s
recebe 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 strptime
e 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