arrays - bash- find average of numbers in line -


i trying read file line line , find average of numbers in each line. getting error: expr: non-numeric argument

i have narrowed problem down sum=expr $sum + $i, i'm not sure why code doesn't work.

while read -a rows     in "${rows[@]}"             sum=`expr $sum + $i`         total=`expr $total + 1`     done     average=`expr $sum / $total` done < $filename 

the file looks (the numbers separated tabs):

1       1       1       1       1 9       3       4       5       5 6       7       8       9       7 3       6       8       9       1 3       4       2       1       4 6       4       4       7       7 

with minor corrections, code runs well:

while read -a rows     total=0     sum=0     in "${rows[@]}"             sum=`expr $sum + $i`         total=`expr $total + 1`     done     average=`expr $sum / $total`     echo $average done <filename 

with sample input file, output produced is:

1 5 7 5 2 5 

note answers because expr integer arithmetic.

using sed preprocess expr

the above code rewritten as:

$ while read row; expr '(' $(sed 's/  */ + /g' <<<"$row") ')' / $(wc -w<<<$row); done < filename 1 5 7 5 2 5 

using bash's builtin arithmetic capability

expr archaic. in modern bash:

while read -a rows     total=0     sum=0     in "${rows[@]}"             ((sum += $i))         ((total++))     done     echo $((sum/total)) done <filename 

using awk floating point math

because awk floating point math, can provide more accurate results:

$ awk '{s=0; (i=1;i<=nf;i++)s+=$i; print s/nf;}' filename 1 5.2 7.4 5.4 2.8 5.6 

Comments

Popular posts from this blog

resizing Telegram inline keyboard -

command line - How can a Python program background itself? -

php - "cURL error 28: Resolving timed out" on Wordpress on Azure App Service on Linux -