2014-09-28 83 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