如何在awk中使用mktime时保留毫秒信息?

时间:2013-02-21 05:37:05

标签: date awk strftime mktime

我的日期字符串格式为2012-12-20T01:16:02.05,我希望转换为格式2011-12-20-01.16.02.050000

目前我正在按照以下方式进行

format = "%F-%H.%M.%S.%N"
split(stringinput,input,"T"); 
split(input[1],date,"-")
split(input[2],time,":")

 return strftime(format,mktime(date[1] " " date[2] " " date[3] " " time[1] " " time[2] " " time[3] " " time[4]));

但我正在丢失微秒信息或毫秒信息。我怎么能得到它。它正在返回2011-12-20-01.16.02。%N

还有任何建议使字符串解析更通用。目前它只支持一种格式。

感谢。

3 个答案:

答案 0 :(得分:1)

您需要单独处理毫秒数据。另外,使用gensub()格式化字符串信息。像:

一样运行
awk -f script.awk

script.awk的内容:

BEGIN {

    string = "2012-12-20T01:16:02.05"

    groups = "^(....)-(..)-(..).(..):(..):(..).*"
    format = "\\1 \\2 \\3 \\4 \\5 \\6"

    datespec = gensub(groups, format, "", string)
    timestamp = mktime(datespec)


    newstring = strftime("%F-%H.%M.%S", timestamp)

    sub(/.*\./,"",string)

    printf "%s.%s0000\n", newstring, string
}

结果:

2012-12-20-01.16.02.050000

<强> 编辑:

BEGIN {

    string = "2011-01-10T14:45:13.815-05:00"

    groups = "^(....)-(..)-(..).(..):(..):(..).*"
    format = "\\1 \\2 \\3 \\4 \\5 \\6"

    datespec = gensub(groups, format, "", string)
    timestamp = mktime(datespec)


    sub(/.*\./,"",string)

    offset = substr(string,4)

    split(offset,array,":")

    seconds = (array[1] * 60 * 60) + (array[2] * 60)

    newstring = strftime("%F-%H.%M.%S", timestamp - seconds, 1)

    printf "%s.%s00\n", newstring, substr(string,0,3)
}

结果:

2011-01-10-09.45.13.81500

答案 1 :(得分:1)

你为什么使用mktime()?您描述的更改只是文本更改:

$ echo "2012-12-20T01:16:02.05" | awk '{sub(/T/,"-"); gsub(/:/,"."); print $0 "0000"}'
2012-12-20-01.16.02.050000

我认为在您的输出中将2012年更改为2011年时,这只是一个错字。

答案 2 :(得分:0)

因为我希望我的GNU日期精度与awk相匹配,所以我必须在以下方面做到这一点:

x='2019-05-30 14:09:20.074'
echo $x | awk '{split($1,a,"-");;split($2,b,".");split(b[1],c,":");s=a[1]" "a[2]" "a[3]" "c[1]" "c[2]" "c[3];tt=mktime(s);print tt b[2] "000000"}'
1559196560074000000

date --date=$x +'%s%N'
1559196560074000000

现在,我能够使这两个协议达成一致,现在我可以在awk中进行比较逻辑了。