微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

AWK:将时间戳转换为纪元;第一条记录总是返回 -1

如何解决AWK:将时间戳转换为纪元;第一条记录总是返回 -1

我有一个带有时间戳和里程表读数的输入文件,如下所示:

2017-09-16 18:14:00,80465
2017-09-19 18:23:00,80898
2017-09-21 08:05:00,81253
2017-09-27 18:20:00,82155
2017-10-03 18:36:00,82902
2017-10-09 18:33:00,83699

... 并想添加转换为纪元的时间戳,代码如下:

BEGIN {}
{
    # change timestamp to epoch (without TZ correction)
    epoch_returned = timestamp_to_epoch($1)
    printf("%s,%s\n",$0,epoch_returned)
}

function timestamp_to_epoch(timestamp_in) {
    FPAT = "[0-9][0-9]"
    epoch_out = mktime($1$2" "$3" "$4" "$5" "$6" "$7)
    return epoch_out
}

输出结果如下:

2017-09-16 18:14:00,80465,-1
2017-09-19 18:23:00,80898,1505809380
2017-09-21 08:05:00,81253,1505945100
2017-09-27 18:20:00,82155,1506500400
2017-10-03 18:36:00,82902,1507019760
2017-10-09 18:33:00,83699,1507537980

第一行总是返回-1。 我已经删除了输入文件中的第一行,(当时)第一行仍然返回 -1。 我只在输入中留下了一行。也返回-1。

如果我在输入文件中输入一个空行,它返回-1,而所有其他的都按预期添加纪元。

我已经看了很长时间,无法弄清楚。

我在GNU Awk 5.0.1,API: 2.0 (GNU MPFR 4.0.2,GNU MP 6.2.0)上使用 Linux Mint 20.1 Cinnamon 4.8.6

任何提示表示赞赏。

解决方法

将 FPAT 行移到 BEGIN 块中。当您第一次调用该函数时,awk 已经使用默认 FS 将行拆分为字段。

并且您直接在函数中使用编号字段,因此没有必要传递参数。

,

如果您想使用 FPAT 将输入拆分为字段,那么您将在错误的位置使用它,它必须位于 BEGIN 部​​分,但这不是您要尝试的要做到这一点,您的数据是 , 分隔的,您只是想将时间戳分成 2 位数字段。要做到这一点,您可以使用 patsplit() 而不是 FPAT(两者都只能呆呆,就像 mktime() 一样):

$ cat tst.awk
BEGIN { FS=OFS="," }
{
    # change timestamp to epoch (without TZ correction)
    epoch_returned = timestamp_to_epoch($1)
    print $0,epoch_returned
}

function timestamp_to_epoch(timestamp_in,t,epoch_out) {
    patsplit(timestamp_in,/[0-9][0-9]/)
    epoch_out = mktime(t[1] t[2] " " t[3] " " t[4] " " t[5] " " t[6] " " t[7])
    return epoch_out
}

$ awk -f tst.awk file
2017-09-16 18:14:00,80465,1505603640
2017-09-19 18:23:00,80898,1505863380
2017-09-21 08:05:00,81253,1505999100
2017-09-27 18:20:00,82155,1506554400
2017-10-03 18:36:00,82902,1507073760
2017-10-09 18:33:00,83699,1507591980

但就我个人而言,我会使用简单的旧 split() 而不是 patsplit()

split(timestamp_in,/[- :]/)
epoch_out = mktime(t[1] " " t[2] " " t[3] " " t[4] " " t[5] " " t[6])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。