2014-09-28 88 views
1

對於下面的數據,我試圖確定隨着時間的推移,總共會使用awk文件。 (加班規則:如果超過40小時的工作,每一個小時後,獲得1.5倍的工資)加班費的awk計算

Natlie Attired 902-555-1234 10.40 44 
Guy Wyre 401-555-3421 11.75 40 

這是我迄今爲止

BEGIN{ 
    FS=" " 
} 
function total(){ 
    hours = awk {print $5} 
    rate = awk {print $4} 
    if(hours<=40) 
     sum=rate*hours 
     return sum 
    else 
     sum=(hours - 40 * 1.5 * rate) + (rate*hours) 
     return sum 
} 

{ 
    printf("%s %s worked %d hours, for a total pay of %.2f.\n", $1, $2,$5, total()) 
} 

我需要什麼,以改變這產生一個準確的答案?

+0

你不[R最後需要'BEGIN'塊;默認的字段分隔符就足夠了。 – 2014-09-29 03:50:02

回答

2

爲了使執行沒有錯誤,我只好:

  • 刪除awk {print ...}周邊$5$4
  • 加括號的if-then-else語句

要使計算正確,我不得不:

  • put p各地hours - 40
  • arentheses通過0.5更換1.5(或者,通過(rate * 40)更換(rate * hours)

結果代碼:

function total() { 
    hours = $5; 
    rate = $4; 
    if (hours <= 40) { 
     sum = rate * hours; 
     return sum; 
    } 
    else { 
     sum = ((hours - 40) * 0.5 * rate) + (rate * hours); 
     return sum; 
    } 
} 

{ 
    printf("%s %s worked %d hours, for a total pay of %.2f.\n", $1, $2, $5, total()); 
} 

輸出:

Natlie Attired worked 44 hours, for a total pay of 478.40. 
Guy Wyre worked 40 hours, for a total pay of 470.00. 
+1

由於[運算符優先級](http://www.gnu.org/software/gawk/manual/html_node/Precedence.html#Precedence),括號是必需的:'*'的優先級高於'-' – 2014-09-28 23:58:26

2
$ cat tst.awk 
function total( regHours, otHours, rate, sum){ 
    rate = $4 
    regHours = $5 
    if (regHours > 40) { 
     otHours = regHours - 40 
     regHours = 40 
    } 
    sum = ((otHours * 1.5) + regHours) * rate 
    return sum 
} 

{ 
    printf "%s %s worked %d hours, for a total pay of %.2f.\n", $1, $2, $5, total() 
} 
$ 
$ awk -f tst.awk file 
Natlie Attired worked 44 hours, for a total pay of 478.40. 
Guy Wyre worked 40 hours, for a total pay of 470.00. 
+1

quick關於awk函數的教程:通過將函數變量添加到參數列表來本地化函數變量。按照慣例,通過一些空格將局部變量的函數參數分開。 http://www.gnu.org/software/gawk/manual/html_node/Definition-Syntax.html#Definition-Syntax – 2014-09-29 00:01:37