bash中的日期减法

时间:2017-08-06 06:02:30

标签: bash date

我希望获得以下示例的日期连续差异。如何将每个日期转换为纪元秒?

7/21/17 6:39:12:167 GMT
7/21/17 6:39:12:168 GMT
7/21/17 6:39:12:168 GMT
7/21/17 6:39:12:205 GMT
7/21/17 6:39:12:206 GMT
7/21/17 6:39:12:206 GMT

一旦每一行转换为纪元秒,我就可以简单地运行另一个脚本来获得每一行的连续差异。感谢。

3 个答案:

答案 0 :(得分:2)

您可以使用date命令转换时间。给出这样一条线:

7/21/17 6:39:12:167 GMT

首先需要在秒部分之后和之后删除所有内容,以获取此信息:

7/21/17 6:39:12

您可以使用cut -d: -f1-3。然后,转换为纪元秒,如果您使用的是FreeBSD或Mac OS:

date -ujf "%m/%d/%y %H:%M:%S" "7/21/17 6:39:12" +%s

给出了:

1500619152

如果您使用的是GNU日期(例如在Linux上),则可以向其提供整个日期文件。由于输入文件的格式不正确,我们可以这样做:

date --file <(cut -d: -f1-3 infile) +%s

只需调用一次date即可读取整个文件,效率更高,但仅适用于GNU日期。

答案 1 :(得分:1)

这是GNU awk中的一个。它将时间戳转换为以秒为单位的纪元时间,并从后者中减去前者。用于转换的mktime函数不会花费几分之一秒,但会将分数存储到哈希a[7],并且在减去之前没有任何内容阻止您将其添加到t var:

$ awk '
function zeropad(s) {              # zeropad function 
    return sprintf("%02d", s)
}
{
    split($0,a,"[/ :]")            # split timestamp to a
    for(i in a) 
        a[i]=zeropad(a[i])         # zeropad all components
    t=mktime(20 a[3] " " a[1] " " a[3] " " a[4] " " a[5] " " a[6]) 
    # add the fractions in a[7] here
    if(NR>1)                       # might be unnecessary
        print t-p                  # output subtracted seconds
    p=t                            # set current time to previous
}' file
0
0
0
0
0

由于您没有包含预期的输出或正确的数据样本,这是我现在能做的最好的。

修改

由于您的数据没有完全反映是否显示一秒的分数,如0:0:0:100或0:0:0:1我将zeropad函数修改为左右垫给定值。现在,您可以将其称为zeropad(value, count, left/right)zeropad(a[7],3,"r")

function zeropad(s,c,d) {
    return sprintf("%" (d=="l"? "0" c:"") "d" (d=="r"?"%0" c-length(s) "d":""), s,"")
}
{
    split($0,a,"[/ :]")            # split timestamp to a
    for(i in a) 
        a[i]=zeropad(a[i],2,"l")   # left-pad all components with 0s
    t=mktime(20 a[3] " " a[1] " " a[3] " " a[4] " " a[5] " " a[6]) 
    t=t+zeropad(a[7],3,"r")/1000   # right-pad fractions with 0s
    if(NR>1)                       # might be unnecessary
        print t-p                  # output subtracted seconds
    p=t                            # set current time to previous
}
0.00999999
0
0.37
0.00999999
0
带有适当修饰符的

printf可能应该用于输出以获得合理的值。

答案 2 :(得分:0)

假设您在变量中有其中一个日期:

$ d='7/21/17 6:39:12:167 GMT'

使用GNU日期,我们需要删除毫秒部分。这可以通过bash的模式替换

来完成
$ echo "${d/:??? / }"
7/21/17 6:39:12 GMT

要将其转换为秒 - 自 - 纪元,我们使用-d选项设置日期和%s格式以请求秒 - 自 - 纪元:

$ date -d "${d/:??? / }" +%s
1500619152

兼容性:Mac OSX不支持GNU的-d选项,但我认为它有类似的选项。在许多操作系统上,包括OSX,都可以选择安装GNU实用程序。