希望使用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
将现有时间戳转换为纪元的正确语法是什么?
答案 0 :(得分:6)
$ 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()函数编写为(借用@ sputnik的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()只是为了表明secs是正确的 - 用你认为合适的date
替换。
对于非gawk版本,您只需要弄清楚如何将年份输入到输入月份/日期/时间字符串中,date
了解这一点是否符合您的要求 - 不应该硬。
答案 1 :(得分:2)
您可以使用以下代码段将日期转换为纪元:
$ date -d 'Tuesday, November 26 12:17 PM' +%s
1385464620
最后:
awk -F";" '{system("date -d \""$6"\" '+%s'")}' file
感谢@Keiron的片段。