使用GAWK的CSV文件中的时间戳到Epoch

 我2你1生1世你知到_164 发布于 2023-02-13 16:51

希望使用GAWK将人类可读时间戳转换为CSV文件中的纪元/ Unix时间,以准备加载到MySQL数据库中.

数据示例:

{null};2013-11-26;Text & Device;Location;/file/path/to/;Tuesday, November 26 12:17 PM;1;1385845647

希望在11月26日星期二下午12:17进入第6列,并转换为纪元时间进行存储.显示的所有时间都是EST格式.我意识到AWK是这个的工具,但似乎无法构建命令.目前有:

cat FILE_IN.CSV | awk 'BEGIN {FS=OFS=";"}{$6=strftime("%s")} {print}' 

但是这会返回:

{null};2013-11-26;Text & Device;Location;/file/path/to/;1385848848;1;1385845647

据推测,这意味着我正在调用当前的纪元时间(1385848848是执行时的当前纪元)而不是要求strftime转换字符串; 但我无法想象另一种方法.

gawk/ strftime将现有时间戳转换为纪元的正确语法是什么?

编辑:这个问题似乎与我如何在另一个命令中使用awk的输出松散相关?

1 个回答
  • $ cat file
    {null};2013-11-26;Text & Device;Location;/file/path/to/;Tuesday, November 26 12:17 PM;1;1385845647
    
    $ gawk 'BEGIN{FS=OFS=";"} {gsub(/-/," ",$2); $2=mktime($2" 0 0 0")}1' file
    {null};1385445600;Text & Device;Location;/file/path/to/;Tuesday, November 26 12:17 PM;1;1385845647
    

    以下是使用当前格式作为示例,通常将日期从任何格式转换为自纪元以来的秒数,并使用注释逐步显示转换过程:

    $ cat tst.awk
    function cvttime(t,     a) {
        split(t,a,/[,: ]+/)
        # 2013 Tuesday, November 26 10:17 PM
        #  =>
        #    a[1] = "2013"
        #    a[2] = "Tuesday"
        #    a[3] = "November"
        #    a[4] = "26"
        #    a[5] = "10"
        #    a[6] = "17"
        #    a[7] = "PM"
    
        if ( (a[7] == "PM") && (a[5] < 12) ) {
            a[5] += 12
        }
        # => a[5] = "22"
    
        a[3] = substr(a[3],1,3)
        # => a[3] = "Nov"
    
        match("JanFebMarAprMayJunJulAugSepOctNovDec",a[3])
        a[3] = (RSTART+2)/3
        # => a[3] = 11
    
        return( mktime(a[1]" "a[3]" "a[4]" "a[5]" "a[6]" 0") )
    }
    
    BEGIN {
        mdt ="Tuesday, November 26 10:17 PM"
        secs = cvttime(2013" "mdt)
        dt = strftime("%Y-%m-%d %H:%M:%S",secs)
        print mdt ORS "\t-> " secs ORS "\t\t-> " dt
    }
    $ awk -f tst.awk
    Tuesday, November 26 10:17 PM
            -> 1385525820
                    -> 2013-11-26 22:17:00
    

    我相信你可以修改当前问题.

    另外,如果你没有gawk,可以将cvttime()函数编写为(借用@subnik的date命令字符串):

    $ cat tst2.awk
    function cvttime(t,     cmd,secs) {
        cmd = "date -d \"" t "\" '+%s'"
        cmd | getline secs
        close(cmd)
        return secs
    }
    
    BEGIN {
        mdt ="Tuesday, November 26 10:17 PM"
        secs = cvttime(mdt)
        dt = strftime("%Y-%m-%d %H:%M:%S",secs)
        print mdt ORS "\t-> " secs ORS "\t\t-> " dt
    }
    $
    $ awk -f tst2.awk
    Tuesday, November 26 10:17 PM
            -> 1385525820
                    -> 2013-11-26 22:17:00
    

    我在那里留下了srtftime()只是为了表明秒是正确的 - 用date你认为合适的替换.

    对于非gawk版本,您只需要弄清楚如何将年份输入到输入月份/日期/时间字符串中,以便date了解这是否与您相关 - 不应该很难.

    2023-02-13 16:53 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有