GNU/Linux >> Tutoriales Linux >  >> Linux

Reformatear la marca de tiempo en un archivo delimitado por tuberías

Esas "marcas de tiempo" no son segundos desde la época como strftime() opera, son solo fechas + horas sin separadores entre años, meses, etc. Solo necesita una manipulación de texto simple, no el uso de funciones de tiempo.

Con GNU awk (que ya estás usando) para gensub():

$ awk 'BEGIN{FS=OFS="|"} {$4=gensub(/(.{4})(..)(..)(..)(..)(..)/,"\\1-\\2-\\3 \\4:\\5:\\6",1,$4)} 1' file
John|Doe|TEST|2021-07-28 12:08:21|[email protected]
John|Davis|TEST|2021-08-28 12:08:21|[email protected]
John|Smith|TEST|2021-05-28 12:08:21|[email protected]

o con cualquier awk:

$ awk 'BEGIN{FS=OFS="|"} {$4=sprintf("%s-%s-%s %s:%s:%s", substr($4,1,4), substr($4,5,2), substr($4,7,2), substr($4,9,2), substr($4,11,2), substr($4,13,2))} 1' file
John|Doe|TEST|2021-07-28 12:08:21|[email protected]
John|Davis|TEST|2021-08-28 12:08:21|[email protected]
John|Smith|TEST|2021-05-28 12:08:21|[email protected]

Suposición:El campo a cambiar es el único o el primero que contiene exactamente 14 dígitos.

sed -E 's=\|([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})\|=|\1-\2-\3 \4:\5:\6|='

Tu intento falla porque $4 tendría que ser el tiempo de UNIX Epoch (tiempo en segundos desde 1970), como documenta el manual de GNU Awk.


Si quieres usar un strftime -como método, entonces podría considerar Miller, que también proporciona el correspondiente strptime ej.

$ mlr --nidx --fs '|' put -S '
    $4 = strftime(strptime($4,"%Y%m%d%H%M%S"),"%Y-%m-%d %H:%M:%S")
  ' file
John|Doe|TEST|2021-07-28 12:08:21
John|Davis|TEST|2021-08-28 12:08:21
John|Smith|TEST|2021-05-28 12:08:21

Linux
  1. 5 ejemplos de comandos táctiles de Linux (cómo cambiar la marca de tiempo del archivo)

  2. ¿Cómo canalizo una llamada de subproceso a un archivo de texto?

  3. Agregar marca de tiempo a un nombre de archivo con mv en BASH

  4. Agregar un encabezado a un archivo delimitado por tabulaciones

  5. ¿La tubería tiene que escribir un archivo temporal?

Cómo encontrar archivos basados ​​en la marca de tiempo en Linux

Tubería B a D? – A &&B || C | ¿D?

Linux canaliza el archivo de audio a la entrada del micrófono

cp -L frente a cp -H

Agregar una columna de valores en un archivo delimitado por tabulaciones

¿Cómo agrupar los comandos en un archivo preconfigurado de Debian?