我有一个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
。