"Stempel waktu" itu bukan detik sejak zaman sebagai strftime()
beroperasi, itu hanya tanggal+waktu tanpa pemisah antara tahun, bulan, dll. Anda hanya perlu manipulasi teks sederhana, bukan penggunaan fungsi waktu.
Dengan GNU awk (yang sudah Anda gunakan) untuk 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]
atau dengan 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]
Asumsi:Kolom yang akan diubah adalah satu-satunya atau kolom pertama yang berisi tepat 14 digit.
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|='
Upaya Anda gagal karena $4
harus menjadi waktu UNIX Epoch (waktu dalam detik sejak 1970), sebagaimana dokumen manual GNU Awk.
Jika Anda ingin menggunakan strftime
-seperti metode, maka Anda dapat mempertimbangkan Miller, yang juga menyediakan strptime
yang sesuai mis.
$ 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
Apakah aman mem-boot komputer yang kehilangan daya saat menangguhkan ke disk?
Apa artinya distribusi Linux menjadi stabil dan seberapa penting bagi pengguna biasa?