¿Cómo puedo convertir marcas de tiempo en una columna a una fecha?

15

Tengo un archivo que contiene esto:

1415602803,LOGIN SUCCESS,AUTH,user2,192.168.203.63,10.146.124.73,59996,22
1415602807,LOGIN SUCCESS,AUTH,user1,172.24.31.10,172.32.1.1,48191,22
1415602811,LOGIN FAILED,AUTH,root,172.24.166.153,10.146.124.73,52506,22
1415602815,LOGIN FAILED,AUTH,user3,192.168.123.55,10.146.32.99,55750,22

Quiero convertir la marca de tiempo a una fecha en este formato:

2014-11-10 02:00:03,LOGIN SUCCESS,AUTH,user2,192.168.203.63,10.146.124.73,59996,22
2014-11-10 02:00:07,LOGIN SUCCESS,AUTH,user1,172.24.31.10,172.32.1.1,48191,22
2014-11-10 02:00:11,LOGIN FAILED,AUTH,root,172.24.166.153,10.146.124.73,52506,22
2014-11-10 02:00:15,LOGIN FAILED,AUTH,user3,192.168.123.55,10.146.32.99,55750,22

¿Cómo puedo hacer eso?

Sé que esto funciona: perl -pe 's/(\d+)/localtime($1)/e'(de esta pregunta ) pero el formato de salida es Mon Nov 10 02:00:03 2014.

Sé que este comando se puede convertir marcas de tiempo en mi salida deseada: date -d@1415602803 +"%F %H:%M:%S", pero no pude hacer que funcione con awkel uso system("cmd")debido a todas las citas y otras cosas.

Alaa Ali
fuente

Respuestas:

6

Como esto quizás

perl -pe 'use POSIX qw(strftime); s/^(\d+)/strftime "%F %H:%M:%S", localtime($1)/e' 
Marki
fuente
17

Encontré algo aquí: Stackoverflow - Convertir de unixtime en la línea de comando .

Se le ocurrió esto:

awk -F"," '{OFS=","; $1=strftime("%Y-%m-%d %H:%M:%S", $1); print $0}' file
  • -F","para usar un separador de campo de ,,
  • OFS=",";para que los campos de salida también estén separados por a ,,
  • $1=strftime("%Y-%m-%d %H:%M:%S", $1);para cambiar el valor del primer campo $1al formato especificado, y
  • print $0; para imprimir toda la línea.
Alaa Ali
fuente
2
awk 'BEGIN{ print strftime("%Y-%m-%d %H:%M:%S", 0) }'da awk: line 2: function strftime never definedaquí. ¡Por favor aclare que NO TODO AWK tiene strftime()! Para una solución que se ejecute en la mayoría de los AWK (¿todos?), Utilice el datecomando externo para mantenerse portátil.
2
@yeti, hay algunas dateimplementaciones que pueden convertir fechas entre formatos como una extensión, pero la forma en que se realiza varía completamente entre las implementaciones. Por ejemplo, la solución dada por Costas usa una sintaxis específica de GNU date. Si quieres portabilidad, úsala perl.
Stéphane Chazelas
4

Si lo desea awk, puede usar comandos externos datecon cualquier formato de fecha

awk -F, -v OFS="," '{("date +%F\ %T -d @"$1)|getline $1}1'
Costas
fuente
¡+1 por NO usar strftime()!
44
Tenga en cuenta que el uso de un comando externo incurrirá en un golpe de rendimiento severo, especialmente notable si se procesan miles de filas
Jose Gómez
2

También puedes probar:

cat test.txt | sed 's/^/echo "/; s/\([0-9]\{10\}\)/`date -d @\1`/; s/$/"/' | bash
kayn
fuente
2

Hice una pregunta hace 9 meses que estaba marcada como un duplicado de esta. Acabo de ver una solicitud para publicar la respuesta que funcionó para mí en esta pregunta. Aquí hay un enlace a esa pregunta y respuesta.

/unix//a/304009/172916

Emily Shaffer
fuente