Linux

在管道分隔文件中重新格式化時間戳

  • February 17, 2021

我有一個帶有日期時間的管道分隔文件,格式yyyymmddhhmmss如下。

John|Doe|TEST|20210728120821|john@test.com
John|Davis|TEST|20210828120821|john@test.com
John|Smith|TEST|20210528120821|john@test.com

我正在嘗試將第 4 列中的字元串轉換為yyyy-mm-dd hh:mm:ss這樣

John|Doe|TEST|2021-07-28 12:08:21|john@test.com
John|Davis|TEST|2021-08-28 12:08:21|john@test.com
John|Smith|TEST|2021-05-28 12:08:21|john@test.com

由於我是 Linux 文本處理的新手,所以我搜尋並嘗試使用awk這樣的

awk -F"|" '{OFS="|"; $4=strftime("%Y-%m-%d %H:%M:%S", $4); print $0}'

但它沒有按預期進行轉換。

那些“時間戳”不是自紀元以來的秒數strftime(),它們只是日期+時間,在年份、月份等之間沒有分隔符。您只需要一個簡單的文本操作,而不是使用時間函式。

對於 gensub() 使用 GNU awk(您已經在使用):

$ 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|john@test.com
John|Davis|TEST|2021-08-28 12:08:21|john@test.com
John|Smith|TEST|2021-05-28 12:08:21|john@test.com

或使用任何 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|john@test.com
John|Davis|TEST|2021-08-28 12:08:21|john@test.com
John|Smith|TEST|2021-05-28 12:08:21|john@test.com

引用自:https://unix.stackexchange.com/questions/634809