使用 awk mktime 在 cvs 中将日期时间字段转换为纪元



我有一个csv文件,它连接了大约6英里的分离线

1,2018-11-25 23:00:26,403,74
1,2018-11-25 23:02:10,406,68
1,2018-11-25 23:04:19,448,108
1,2018-11-25 23:05:26,417,79
1,2018-11-25 23:05:30,378,80
1,2018-11-25 23:05:31,360,78
1,2018-11-25 23:06:45,391,79
1,2018-11-25 23:06:50,432,76

这些时间是UTC,我住在欧洲UTC + 1。我已经"编写"了我的第一个AWK脚本:test.awk:

BEGIN { FS=",";OFS="t"}
{
$2 = mktime(gensub(/[-:]/,"  ","g",$2))
print
}

当我运行时:

$ awk -f test.awk mark.csv

它给出输出:

1   1543183226  403 74
1   1543183330  406 68
1   1543183459  448 108
1   1543183526  417 79
1   1543183530  378 80
1   1543183531  360 78
1   1543183605  391 79
1   1543183610  432 76

看起来还行,但问题是纪元提前了一个小时

1543183226≠2018-11-25 23:00:26 but 1543183226=2018-11-25 22:00:26

为了解决这个问题,我正在研究

strftime([format [, timestamp[, utc-flag]]])

我快到了,但我可以使用一些帮助。

谢谢

只需在调用 awk 之前将时区 (TZ( 变量设置为UTC或为 mktime(( 设置 UTC 标志:

$ awk 'BEGIN{print mktime("2018 11 25 23 00 26")}'
1543208426
$ TZ=UTC awk 'BEGIN{print mktime("2018 11 25 23 00 26")}'
1543186826
$ awk 'BEGIN{print mktime("2018 11 25 23 00 26",1)}'
1543186826
$ awk 'BEGIN{print mktime("2018 11 25 22 00 26",1)}'
1543183226

编辑: 从 Ed sir 的代码中获取参考并应用于此代码。

TZ=UTC awk '
BEGIN{
FS=","
OFS="t"
}
{
$2 = mktime(gensub(/[-:]/,"  ","g",$2))
print $2
}'  Input_file


您能否尝试以下操作。由于 1 小时有 3600 秒,所以我所做的是在将 $2 的值发送到strftime我将其减去其值,我们得到了 1 小时前的值(这种方法并不灵活,应该只使用上面的代码(。

awk '
BEGIN{
FS=","
OFS="t"
}
{
$2 = mktime(gensub(/[-:]/,"  ","g",$2))
print strftime("%Y-%m-%d %H:%M:%S",$2-3600)
}'  Input_file

第一行的输出现在将2018-11-25 22:00:26

最新更新