
Tengo un conjunto de datos como este:
user1 1234 01/01/2020
user2 2345 02/02/2020
Necesito convertir la tercera columna (fecha) a EPOCH conservando el nombre de usuario y el número de identificación.
user1 1234 1577862000
user2 2345 1580626800
Pude hacer funcionar la conversión y la impresión, pero la nueva fecha se agrega a una nueva línea.
$awk '{print($1,$2)}; system("date -d "$3" +%s")' data
user1 1234
1577862000
user2 2345
1580626800
¿Cómo puedo hacer que la nueva fecha EPOCH esté en la misma línea que las columnas 1 y 2?
Respuesta1
print
agrega una nueva línea de forma predeterminada. Usar printf
:
awk '{printf "%s %s ",$1,$2; system("date -d "$3" +%s")}' data
Si se hubiera definido un separador de campo de salida especial OFS
, podría usar
awk '{printf "%s%s%s%s",$1,OFS,$2,OFS; system("date -d "$3" +%s")}' data
Observe que cada uno %s
obtiene uno de los argumentos restantes printf
.
Producción:
user1 1234 1577847600
user2 2345 1580612400
Respuesta2
Si tiene GNU awk (también conocido como gawk
), puede usar su función de hora incorporada mktime
(aunque el formato de fecha de entrada necesita cierta manipulación primero):
$ 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 proporciona un estilo C strptime
y strftime
:
$ mlr --nidx put '$3 = strftime(strptime($3,"%d/%m/%Y"),"%s")' data
user1 1234 1577854800
user2 2345 1580619600
o similarmente en Perl, con el módulo Time::Pieza:
$ 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