我有一个包含以下数据的文件,尝试将第一个字段值转换为日期,但是缺少第二个字段
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 时间代替本地时间,请替换localtime
为gmtime
或在命令前添加前缀。TZ=UTC0
¹ 请注意,由于该格式没有指定时区偏移量,因此在执行 DST 的时区中它是不明确的,因为两个不同的纪元时间可以给出相同的时间戳。例如,1698539456
和都会在欧洲/伦敦时区1698543056
产生相同的时间戳20231029013056