Reemplazo de fecha con EPOCH en la salida de la columna

Reemplazo de fecha con EPOCH en la salida de la columna

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

printagrega 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 %sobtiene 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 strptimey 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

información relacionada