Ces "horodatages" ne sont pas des secondes depuis l'époque en tant que strftime()
fonctionne, ce sont juste des dates + heures sans séparateurs entre les années, les mois, etc. Vous avez juste besoin d'une simple manipulation de texte, pas d'utilisation de fonctions temporelles.
Avec GNU awk (que vous utilisez déjà) pour 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]
ou avec n'importe quel 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]
Hypothèse :Le champ à modifier est le seul ou le premier qui contient exactement 14 chiffres.
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|='
Votre tentative échoue car $4
devrait être l'heure UNIX Epoch (temps en secondes depuis 1970), comme le documente le manuel GNU Awk.
Si vous souhaitez utiliser un strftime
-like méthode, alors vous pourriez envisager Miller, qui fournit également le strptime
correspondant ex.
$ 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