为什么awk在第一个条目中跳过第二个字段?

时间:2014-02-06 10:46:02

标签: bash awk

我手动创建格式为

的日志文件
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分钟。它将计算小时;它不会计算分钟数。其他记录没有这样的问题,但它总是在第一条记录中按分钟计算。

可能导致此行为的原因是什么?我该如何调试呢?

2 个答案:

答案 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 }'