我有以下输入:
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