在unix命令中将纪元转换为人类可读的日期到正常日期

在unix命令中将纪元转换为人类可读的日期到正常日期

我有一个包含以下数据的文件,尝试将第一个字段值转换为日期,但是缺少第二个字段

cat memoey-total.csv
1700561388,277126765312
1700561647,277126765312
1700561811,277126765312
1700562945,277126765312
1700563689,277126765312

awk '{$1 = strftime("%Y%m%d%H%M%S", substr($1,1,10))} 1' memoey-total.csv

20231121100948
20231121101407
20231121101651
20231121103545
20231121104809
20231121110003
20231121111003
20231121112003

我能够转换为所需的格式,但如何在输出中获取第二个字段?

答案1

您需要告诉 AWK(Gawk,从技术上讲,因为您正在使用strftime)使用逗号作为输入和输出的字段分隔符:

$ awk 'BEGIN { OFS = FS = "," } {$1 = strftime("%Y%m%d%H%M%S", substr($1,1,10))} 1' memoey-total.csv
20231121110948,277126765312
20231121111407,277126765312
20231121111651,277126765312
20231121113545,277126765312
20231121114809,277126765312

Gawk 5.3.0 或更高版本, 您可以使用CSV模式( --csv) 代替(这在最新版本中也可用真正的 awk,但后者没有strftime)。

答案2

perl

perl -MPOSIX -pe 's/\d+/strftime("%Y%m%d%H%M%S", localtime($&))/e'

将第一个数字序列转换为相应的本地时间(采用 YYYYmmddHHMMSS 格式)。

如果您希望 UTC 时间代替本地时间,请替换localtimegmtime或在命令前添加前缀。TZ=UTC0


¹ 请注意,由于该格式没有指定时区偏移量,因此在执行 DST 的时区中它是不明确的,因为两个不同的纪元时间可以给出相同的时间戳。例如,1698539456和都会在欧洲/伦敦时区1698543056产生相同的时间戳20231029013056

相关内容