Shell 文件中日期时间之间的差异

Shell 文件中日期时间之间的差异,shell,awk,Shell,Awk,我有一个这种格式的大型日志文件: 202.32.92.47,01/Jun/1995:00:00:59,/~scottp/publish.html,200,271 ix-or7-27.ix.netcom.com,01/Jun/1995:00:02:51,/~ladd/ostriches.html,200,205908 ... 我需要计算从第一行到当前行的两行之间的差值(以秒为单位)。第二列的格式如下: dd/month/year:HH:MM:SS 我可以在vim中使用以下命令进行更改: :%s

我有一个这种格式的大型日志文件:

202.32.92.47,01/Jun/1995:00:00:59,/~scottp/publish.html,200,271
ix-or7-27.ix.netcom.com,01/Jun/1995:00:02:51,/~ladd/ostriches.html,200,205908
...
我需要计算从第一行到当前行的两行之间的差值(以秒为单位)。第二列的格式如下:

dd/month/year:HH:MM:SS
我可以在vim中使用以下命令进行更改:

:%s/\/Jun\//\:Jun\:/g
然后我得到:

fromkin.lib.uwm.edu,01:Jun:1995:11:58:03,/~scottp/publish.html,200,271
slip1.ac.brocku.ca,01:Jun:1995:11:58:03,/cgi-bin/hytelnet?file=DIR000,200,7748
bertram.hallf.lth.se,01:Jun:1995:11:58:06,/~macphed/finite/fe_resources/node92.html,200,1668
格式:

dd:month:year:HH:MM:SS
有没有办法在shell脚本/awk中实现这一点

我的预期输出是:

fromkin.lib.uwm.edu,01:Jun:1995:11:58:03,/~scottp/publish.html,200,271
slip1.ac.brocku.ca,0,/cgi-bin/hytelnet?file=DIR000,200,7748
bertram.hallf.lth.se,3,/~macphed/finite/fe_resources/node92.html,200,1668

不清楚您的预期输出应该是什么,因为您发布的示例输出与您发布的输入不匹配,但要在发布的示例输入文件中区分2个时间戳,并在第一行和所有后续行中打印时间戳之间的秒数(使用GNU awk作为时间函数):


@fedorqui虽然它在寻找两行之间的差异,但您链接的问题不包括比较第一行和当前行,也不包括使用不同分隔符的一列中的日期和时间……我认为某种程度上解决了这个问题。但没问题,重新打开它。我希望有这样的输出:fromkin.lib.uwm.edu,3,/~scottp/publish.html,200271,所以我希望有一秒钟的时间。我更新了我的答案,对你想要的东西再做一次猜测。以秒为单位获取时间很简单,只是不清楚您发布的预期输出中的所有其他信息来自哪里-(第一行、当前行、前一行、其他文件、其他地方)或者时间差应该在连续行之间,还是在第一行和当前行之间,或者其他什么。在发布问题以显示具体的示例输入和您期望从该输入中获得的具体输出时,这一点很重要。我绝对应该这样做。我修正了它,并把具体的输出,我期待。但答案基本上是正确的。只有第一行不应更改。为此,我修改了脚本。刚刚将“打印”从“其他”块中移出。谢谢!这很有帮助!
$ cat file
202.32.92.47,01/Jun/1995:00:00:59,/~scottp/publish.html,200,271
ix-or7-27.ix.netcom.com,01/Jun/1995:00:02:51,/~ladd/ostriches.html,200,205908
fromkin.lib.uwm.edu,01/Jun/1995:11:58:03,/~scottp/publish.html,200,271
slip1.ac.brocku.ca,01/Jun/1995:11:58:03,/cgi-bin/hytelnet?file=DIR000,200,7748
bertram.hallf.lth.se,01/Jun/1995:11:58:06,/~macphed/finite/fe_resources/node92.html,200,1668
$ cat tst.awk
BEGIN{ FS=OFS="," }
{
    split($2,t,/[\/:]/)
    mthNr = (match("JanFebMarAprMayJunJulAugSepOctNovDec",t[2])+2)/3
    currSecs = mktime(t[3]" "mthNr" "t[1]" "t[4]" "t[5]" "t[6])

    if (NR == 1) {
        baseSecs = currSecs
    }
    else {
        $2 = currSecs - baseSecs
    }
    print
}
$ awk -f tst.awk file
202.32.92.47,01/Jun/1995:00:00:59,/~scottp/publish.html,200,271
ix-or7-27.ix.netcom.com,112,/~ladd/ostriches.html,200,205908
fromkin.lib.uwm.edu,43024,/~scottp/publish.html,200,271
slip1.ac.brocku.ca,43024,/cgi-bin/hytelnet?file=DIR000,200,7748
bertram.hallf.lth.se,43027,/~macphed/finite/fe_resources/node92.html,200,1668