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

希望使用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将现有时间戳转换为epoch的正确语法是什么?

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

解决方法

$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的日期命令字符串):

$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()留在那里只是为了表明秒是正确的 – 用你认为合适的日期替换.

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

相关文章

1、安装Apache。 1)执行如下命令,安装Apache服务及其扩展包...
一、先说一下用ansible批量采集机器信息的实现办法: 1、先把...
安装配置 1. 安装vsftpd 检查是否安装了vsftpd # rpm -qa | ...
如何抑制stable_secret读取关键的“net.ipv6.conf.all.stabl...
1 删除0字节文件 find -type f -size 0 -exec rm -rf {} ...
## 步骤 1:安装必要的软件包 首先,需要确保系统已安装 `dh...