GNU/Linux >> Linux Esercitazione >  >> Linux

Riformatta il timestamp in un file delimitato da pipe

Quei "timestamp" non sono secondi dall'epoca come strftime() opera su, sono solo date + ore senza separatori tra anni, mesi, ecc. Hai solo bisogno di una semplice manipolazione del testo, non dell'uso di funzioni temporali.

Con GNU awk (che stai già usando) per 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 qualsiasi 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]

Ipotesi:il campo da modificare è l'unico o il primo che contiene esattamente 14 cifre.

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|='

Il tuo tentativo fallisce perché $4 dovrebbe essere l'UNIX Epoch time (tempo in secondi dal 1970), come documenta il manuale GNU Awk.


Se vuoi usare un strftime -like, allora potresti considerare Miller, che fornisce anche il corrispondente strptime es.

$ 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. Sostituzione del processo e tubo?

  2. Lo scopo dell'utilizzo di un Fifo contro un file temporaneo o una pipe?

  3. Rimuovere la virgola tra le virgolette solo in un file delimitato da virgole?

  4. Reindirizzamento e uscita del tubo?

  5. 5 esempi di comandi touch di Linux (come modificare il timestamp dei file)

Come trovare file basati su timestamp in Linux

Tubo da B a D? – A&&B || C | D?

Linux reindirizza il file audio all'ingresso del microfono

Pipe deve scrivere un file temporaneo?

timestamp, ora di modifica e ora di creazione di un file

cp -L contro cp -H