首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在带有GAWK的CSV文件中时间戳到Epoch

在带有GAWK的CSV文件中时间戳到Epoch
EN

Stack Overflow用户
提问于 2013-11-30 22:08:42
回答 2查看 7.5K关注 0票数 6

希望使用GAWK将人类可读的时间戳转换为CSV文件中的epoch/Unix时间,以准备加载到MySQL DB中。

数据示例:

代码语言:javascript
复制
{null};2013-11-26;Text & Device;Location;/file/path/to/;Tuesday, November 26 12:17 PM;1;1385845647

期待采取第6栏,星期二,11月26日下午12:17,并转换为划时代的时间存储。所有时间显示的将是EST格式。我意识到AWK是实现这一目标的工具,但它似乎不能很好地构造命令。目前有:

代码语言:javascript
复制
cat FILE_IN.CSV | awk 'BEGIN {FS=OFS=";"}{$6=strftime("%s")} {print}' 

然而,这将返回:

代码语言:javascript
复制
{null};2013-11-26;Text & Device;Location;/file/path/to/;1385848848;1;1385845647

据推测,这意味着我正在调用当前时代时间(1385848848在执行时是当前时代),而不是要求strftime转换字符串;但我想不出另一种方法来做到这一点。

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

编辑:这个问题似乎与How do I use output from awk in another command?无关

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-01 02:53:12

代码语言:javascript
复制
$ 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

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

代码语言:javascript
复制
$ 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()函数编写为(借用@sputnik的date命令字符串):

代码语言:javascript
复制
$ 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()放在里面只是为了表明secs是正确的--根据您的需要用date替换。

对于非gawk版本,您只需要弄清楚如何以date理解的方式将年份输入到输入月份/日期/时间字符串中,如果这对您来说很重要的话--应该不难。

票数 6
EN

Stack Overflow用户

发布于 2013-11-30 22:14:09

您可以使用以下片段将日期转换为纪元:

代码语言:javascript
复制
$ date -d 'Tuesday, November 26 12:17 PM' +%s
1385464620

因此,最后:

代码语言:javascript
复制
awk -F";" '{system("date -d \""$6"\" '+%s'")}' file

谢谢你给我的片段。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20306217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档