使用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 "tt-> " 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 "tt-> " dt } $ $awk -f tst2.awk Tuesday,November 26 10:17 PM -> 1385525820 -> 2013-11-26 22:17:00 我把srtftime()留在那里只是为了表明秒是正确的 – 用你认为合适的日期替换. 对于非gawk版本,您只需要弄清楚如何将年份输入到输入月份/日期/时间字符串中,以便日期了解这是否与您相关 – 不应该很难. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |