2013-03-28 2 views
0

Что я хотел бы код, приведенный ниже, чтобы сделать, это разобрать файл с линиями, похожими наРасчет GPA в awk?

CSC3320,SYSTEM LEVEL PROGRAMMING,3,1,A 
CSC3210,ASSEMBLY LEVEL PROGRAMMING,3,1,B 

и вычислить средний балл на основе от уравнения суммы класса * кредитных часов/суммы кредитных часов. Я пытаюсь сделать это, вычислив числитель и знаменатель отдельно, а затем разделив два и напечатав вывод.

calculate(){ 
    awk -F, ' 
    numerator=0; 
    denominator=0; 
    if($4==1) { 
     if($5=="A"){ 
      numerator+=(4*$3); 
      denominator+=$3 
     } else if ($5 == "B"){ 
      numerator+=(3*$3); 
      denominator+=$3 
     } else if ($5 == "C"){ 
      numerator+=(2*$3); 
      denominator+=$3 
     } else { 
     } 
    } 
    GPA = numerator/denominator 
    printf "Your GPA is %d\n" GPA 
    'my_course.txt 

}

Что я получаю сообщение об ошибке сказав

AWK: строка 4: ошибка синтаксиса или вблизи если
AWK: строка 18: ошибка синтаксиса или вблизи Printf

В моей книге не очень много говорится о том, если иное, если утверждения. Итак, что именно не так с тем, как я набрал это?

+0

Вы не можете иметь переменные, делящиеся за пределами '{....}' block in awk '. Также вам не нужно инициализировать vars в awk. Поэтому 'awk '{calc and print}' 'будет вам ближе. Удачи. – shellter

+0

Возможный дубликат [Awk print integer вместо плавающей запятой] (http://stackoverflow.com/questions/15693976/awk-printing-integer-instead-of-floating-point) –

ответ

1

Этот код работает.

calculate(){ 
    awk -F, ' 
    BEGIN{printf "Your GPA is : "} 
    numerator = 0.0; 
    denominator = 0.0; 
    /^CSC/{ 
    if($4=1) { 
     if($5=="A"){ 
      numerator+=(4.0*$3); 
      denominator+=$3; 
     } else if ($5 == "B"){ 
      numerator+=(3.0*$3); 
      denominator+=$3; 
     } else if ($5 == "C"){ 
      numerator+=(2.0*$3); 
      denominator+=$3; 
     } else { 
      ; 
     } 
    } 
    } 
    END{printf"%f", (numerator/denominator)} 
    ' my_course.txt 
} 
Смежные вопросы