我手动创建格式为
的日志文件date start duration description
2/5 10:00p 1:45 Did this and that.
2/6 2:00a 0:20 Woke up from my slumber.
==============================================
2:05 TOTAL time spent
日志中有许多条目。为避免每次添加条目时手动重新计算总时间,我编写了以下脚本:
#!/bin/bash
file=`ls | grep log`
head -n -1 $file | egrep -o [0-9]:[0-9]{2}[^ap] \
| awk '{ FS = ":" ; SUM += 60*$1 ; SUM += $2 } END { print SUM }'
首先,该脚本假定其名称中只有一个文件log
,这就是我所追求的文件。其次,它使用当前总数以外的所有行,从行中获取时间信息,并将其提供给awk,将其转换为分钟。
这是我遇到问题的地方。最后的金额总是稍微偏离。通过反复试验,我发现awk
永远不会计算第一条记录的第二个字段,例如在这种情况下45分钟。它将计算小时;它不会计算分钟数。其他记录没有这样的问题,但它总是在第一条记录中按分钟计算。
可能导致此行为的原因是什么?我该如何调试呢?
答案 0 :(得分:2)
您没有告诉我们,您的预期输出
是否喜欢这个?
$ cat log
date start duration description
2/5 10:00p 1:45 Did this and that.
2/6 2:00a 0:20 Woke up from my slumber.
==============================================
2:05 TOTAL time spent
Awk Code
awk '$3~/([[:digit:]]):([[:digit:]])/ && !/TOTAL/{
split($3,A,":")
sum+=A[1]*60+A[2]
}
END{
print "Total",sum,"Minutes"
}' log
所得
Total 125 Minutes
答案 1 :(得分:2)
你在循环中设置了FS
,对于第一行来说已经太晚了。
正确的方法是:
echo -e "1:45\n0:20" | awk 'BEGIN { FS=":" } { SUM += 60*$1 + $2 } END { print SUM }'