command line - Errors in Averaging Function Script Code? - Ask Ubuntu


i wrote (questionable) piece of code user-defined average function, code takes second argument of command line invocation, , uses respective field in input file , finds average of of fields (in single column).

the input file named players.data:

lbj:1:1:1:1 kbb:2:2:2:2 kdd:3:3:3:3 ppp:4:4:4:4 llo:5:5:5:5 

my function supposed to, depending on second argument @ invocation, find average of 5 numbers in either 3rd, 4th or fifth column (field).

so given invocation nawk -f testscript2.script players.data row3 should use row3 argv[2], , according below if statement sum row 3 in players.data , output the average of row row3 5.00

error-ridden code listed below:

begin{fs = ":"} { function average(argv[2]){      if(argv[2] == "row3"){             sumjan += $3             avgjan = sumjan / 5             printf "the average of row %-10s %6.2f", argv[2], avgjan             }     else if(argv[2] == "row4"){             sumfeb += $4;             avgfeb = sumfeb / 5             printf "the average of row %-10s %6.2f", argv[2], avgfeb             }     else if(argv[2] == "row5"){             summar += $5             avgmar = summar / 5             printf "the average of row %-10s %6.2f", argv[2], avgmar             }     else{             print "error: invalid input"             }     } } {average(argv[2]) } 

here summary of current errors:

nawk: a6c.script: line 8: syntax error @ or near function nawk: a6c.script: line 15: syntax error @ or near else nawk: a6c.script: line 20: syntax error @ or near else  nawk: a6c.script: line 25: syntax error @ or near else nawk: a6c.script: line 28: syntax error @ or near } 

how code fixed such when above invocation passed desired output displayed?

first, grammar errors

you have 1 { before line function:

begin{fs = ":"} { function average(argv[2]){    ... } 

so should be:

begin{fs = ":"} function average(argv[2]){    ... } 

then, creating function receives parameter. parameter supposed have local scope of function, hence calling argv[2] big misunderstanding of scopes. use like:

function average(row) {      # things variable row  } 

and use argv[2] when calling function: average(argv[2]).

then, concept errors

you using function call on every iteration calculate average. if want use functions, use 1 keep track of values , finally, , then, print values.

also, repeating bunch of code in if - else if - else conditions. note as can $4, can var=row , use $var use rowth's value:

if(argv[2] == "row3"){             sumjan += $3             avgjan = sumjan / 5             printf "the average of row %-10s %6.2f", argv[2], avgjan             } 

can generic:

sum += $row avg = sum / 5 printf "the average of row %-10s %6.2f", row, avgjan 

altogether, can succinct one-liner

$ awk -f: -v col=4 '{sum+=$col} end {print sum/nr}' file 3 

this keeps sum of column number col , divides number of lines.


Comments

Popular posts from this blog

download - Firefox cannot save files (most of the time), how to solve? - Super User

windows - "-2146893807 NTE_NOT_FOUND" when repair certificate store - Super User

sql server - "Configuration file does not exist", Event ID 274 - Super User