awk 中行之间的时间戳计算或求和

awk 中行之间的时间戳计算或求和

我有以下输入:

1. Track 01 05:21
2. Track 02 07:39   
3. Track 03 04:27

我想出了以下脚本

awk -F: '{a+=$(NF-1)*60+$(NF);printf"%d:%02d:%02d\n",a/3600,a%3600/60,a%3600%60}' file

但我得到的结果是这样的:

0:01:21
0:04:00
0:07:27

反过来,使用相同的脚本,当我有一个仅包含时间而没有其他内容的文件时,我会得到正确的输出

输入:

05:21
07:39
04:27

输出:

0:05:21
0:13:00
0:17:27

答案1

使用两个 awk 命令

awk '{print $NF}' file |awk '{a+=$(NF-1)*60+$(NF);printf"%d:%02d:%02d\n",a/3600,a%3600/60,a%3600%60}'

第一个 awk 提取文件的 las 字段,第二个 awk 生成您想要的过程。

无论文件是否仅包含时间,只要时间是行中的最后一个字段,这都有效

答案2

这就是您遇到的问题:当 FS=":" 时,您的第一个字段是“1.Track 01 05”,当您在算术上下文中使用该字符串时,第一个非数字会截断数字,因此分钟值为“1”。您需要使用空格或冒号作为字段分隔符,但任何尾随空格都意味着您有额外的空字段。

我会做

awk '
    BEGIN {h = m = s = 0}
    function add_time(min, sec) {
        s += sec
        m += min
        while (s >= 60) {s -= 60; m++}
        while (m >= 60) {m -= 60; h++}
    }
    {
        split($NF, t, /:/)
        add_time(t[1], t[2])
        printf "%d:%02d:%02d\n", h, m, s
    }
' file

相关内容