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

Вы не р необходим блок 'BEGIN'; разделителя полей по умолчанию достаточно. –

ответ

2

Чтобы сделать это выполнить без ошибок, я должен был:

  • удалить awk {print ...} окружающих $5 и $4
  • добавить фигурные скобки в если-то-другое заявление

Чтобы сделать правильный расчет, мне пришлось:

  • положить p arentheses вокруг hours - 40
  • заменить 1.5 на 0.5 (или, альтернативно, заменить (rate * hours) на (rate * 40))

Результирующий код:

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): '*' имеет более высокий приоритет, чем '-' –

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

Учебник по awk-функциям: вы локализуете переменные функции, добавляя их в список параметров. По соглашению разделите аргументы функции от локальных переменных на некоторые пробелы. http://www.gnu.org/software/gawk/manual/html_node/Definition-Syntax.html#Definition-Syntax –

Смежные вопросы