【问题标题】:Why does awk skip the second field in first entry?为什么 awk 跳过第一个条目中的第二个字段?
【发布时间】:2014-02-06 19:06:48
【问题描述】:

我有一个手动创建的格式的日志文件

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 将其转换为分钟。

这是我遇到问题的地方。最终的总和总是会略有偏差。通过反复试验,我发现awk 永远不会计算第一条记录的第二个字段,例如在这种情况下是 45 分钟。它会计算小时;它不会计算分钟数。其他记录没有这样的问题,但是第一个记录总是以分钟为单位。

什么可能导致这种行为?如何调试?

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    你在循环中设置了FS,第一行已经太迟了。

    正确的做法是:

    echo -e "1:45\n0:20" | awk 'BEGIN { FS=":" } { SUM += 60*$1 + $2 } END { print SUM }'
    

    【讨论】:

    • +1,但我认为“正确”的做法是 awk '{SUM+=...}END{...}' FS=: 而不是使用 BEGIN 块
    • 感谢您的评论,我不知道。我采用了最接近原始代码的解决方案。如果我要这样做,我会使用“-F”选项。
    【解决方案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 代码

    awk '$3~/([[:digit:]]):([[:digit:]])/ && !/TOTAL/{
                                                         split($3,A,":")
                                                         sum+=A[1]*60+A[2]
                                                     }
                                                  END{
                                                         print "Total",sum,"Minutes"
                                                     }' log
    

    结果

     Total 125 Minutes
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-17
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多