代码之家  ›  专栏  ›  技术社区  ›  user180574

awk:尝试将时间戳字符串转换为unix epoch时间

  •  2
  • user180574  · 技术社区  · 1 年前

    我试图使用awk将时间戳字符串转换为unix epoch时间,但几次尝试后都失败了。

    $ echo "2024-04-16 16:32:38.108580" | awk '{ epoch = mktime(gensub(/[:-]/, " ", "g", $1)) + substr($1, index($1, ".")+1) ; print epoch }'
    2023
    
    2 回复  |  直到 1 年前
        1
  •  3
  •   jhnc    1 年前

    您正在操作 $1 但应该在上操作 $0 。如果你仔细检查了你的命令的中间步骤,你就会看到这一点。 您也有一个“一次过”错误。

    这应该有效:

    $ echo "2024-04-16 16:32:38.108580" |
      awk '{
        i = index($0, ".")
        datespec = gensub(/[:-]/, " ", "g", substr($0,1,i-1))
        epoch = mktime(datespec) + substr($0,i)
        printf "%f\n", epoch
      }'
    1713281558.108580
    $
    

    事实上,只是改变 $0 1. 即使只剩下一部分,也可以通过原始作品中的一个错误来解决问题,但我不知道这种行为是否可以保证:

    $ echo "2024-04-16 16:32:38.108580" |
      awk '{
        epoch = mktime(gensub(/[:-]/, " ", "g", $0)) + substr($0, index($0, "."))
        printf "%f\n", epoch
      }'
    1713281558.108580
    $
    
        2
  •  2
  •   markp-fuso    1 年前

    mktime() 正在查找格式的输入 YYYY MM DD HH MM SS 因此在这种情况下,我们希望:

    ### convert this:
    
    2024-04-16 16:32:38.108580
    
    ### to this:
    
    2024 04 16 16 32 38
    

    我们可以通过以下几种方式做到这一点:

    gensub(/[:-]|[.].*$/, " ", "g")
      gsub(/[:-]|[.].*$/, " ")
    

    由于我没有指定一个字段或变量来操作整个行上的函数(即, $0 ).

    OP的代码只对第一个空白分隔字段执行操作( $1 )在这种情况下是 2024-04-16 .OP将需要指定前2个字段( $1 " " $2 )或者整条线( $0 -如果没有指定字段,则默认行为)。

    由于示例输入只有2个空白分隔的字段,我们将坚持处理整行( $0 ).

    将这些更改引入新的 awk 剧本

    ### convert input to mktime() format:
    
    $ echo "2024-04-16 16:32:38.108580" | awk '{ print gensub(/[:-]|[.].*$/, " ", "g") }'
    2024 04 16 16 32 38
    
    ### convert to epoch seconds:
    
    $ echo "2024-04-16 16:32:38.108580" | awk '{ print mktime(gensub(/[:-]|[.].*$/, " ", "g")) }'
    1713303158
    
    ### reverse operation to verify we've got the correct epoch seconds
    
    $ date '+%Y-%m-%d %H:%M:%S' -d @1713303158
    2024-04-16 16:32:38
    

    如果我们需要附加 .108580 最终我们可以重复使用OP substr( index() ) 代码,只要我们记得对整行进行操作( $0 ):

    $ echo "2024-04-16 16:32:38.108580" | awk '{ print mktime(gensub(/[:-]|[.].*$/, " ", "g")) substr($0, index($0, ".")) }'
    1713303158.108580