2014-02-06 75 views
0

我有格式爲什麼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,而這之後,我的文件。其次,除了當前行總數之外的所有行,greps來自行的時間信息,並將其饋送給awk,將awk轉換爲分鐘。

這是我遇到問題的地方。最後的總和總是稍微偏離。通過試驗和錯誤,我發現awk永遠不會記錄第一個記錄的第二個字段,例如在這種情況下45分鐘。它會計數小時;它不會計算分鐘數。它與其他記錄沒有這種問題,但始終是第一條記錄中的分鐘數。

什麼可能導致此行爲?我如何調試它?

回答

2

您在迴路設置FS,它是已經太晚了第一道防線。

做正確的做法是:

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

+1,但我認爲 「正確」 的方式做到這一點是'awk的 '{SUM + = ...} END {...}' FS =:'而不是使用BEGIN塊 –

+0

感謝您的評論,我不知道這一點。 我採取了最接近原始代碼的解決方案。如果我要做這樣的事情,我會使用'-F'選項。 – Josay

+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代碼

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

所得

Total 125 Minutes 
相關問題