Aritmética de punto flotante en script de shell UNIX

¿Cómo hacer aritmética con números de punto flotante como 1.503923 en un script de shell? Los números de coma flotante se extraen de un archivo como una cadena. El formato del archivo es el siguiente:

1.5493482,3.49384,33.284732,23.043852,2.2384... 3.384,3.282342,23.043852,2.23284,8.39283... . . . 

Aquí hay un código de muestra simplificado que necesito para trabajar. Todo funciona bien hasta la aritmética. Saco una línea del archivo, luego extraigo múltiples valores de esa línea. Creo que esto reduciría el tiempo de procesamiento de búsqueda ya que estos archivos son enormes.

 # set vars, loops etc. while [ $line_no -gt 0 ] do line_string=`sed -n $line_no'p' $file_path` # Pull Line (str) from a file string1=${line_string:9:6} # Pull value from the Line string2=${line_string:16:6} string3=... . . . calc1= `expr $string2 - $string7` |bc -l # I tried these and various calc2= ` "$string3" * "$string2" ` |bc -l # other combinations calc3= `expr $string2 - $string1` calc4= "$string2 + $string8" |bc . . . generic_function_call # Use the variables in functions line_no=`expr $line_no - 1` # Counter-- done 

Salida que sigo obteniendo:

 expr: non-numeric argument command not found 

¿Qué hay de esto?

 calc=$(echo "$String2 + $String8"|bc) 

Esto hará que bc agregue los valores de $ String2 y $ String8 y guarda el resultado en la variable calc .

Creo que deberías usar: bc

Por ejemplo:

 echo "scale = 10; 123.456789/345.345345" | bc 

(Es la manera de Unix: cada herramienta se especializa para hacer bien lo que se supone que deben hacer, y todos trabajan juntos para hacer cosas grandiosas. No emule una gran herramienta con otra, haga que funcionen juntas).

Salida:

 .3574879198 

O con una escala de 1 lugar de 10 :

 echo "scale = 1; 123.456789/345.345345" | bc 

Salida:

 .3 

Tenga en cuenta que esto no realiza el redondeo.

Si no tiene el “bc”, puede usar ‘awk’:

 calc=$(echo 2.3 4.6 | awk '{ printf "%f", $1 + $2 }') 

scale in bc es la precisión, por lo que con una escala de 4 si escribe bc < << 'scale = 4; 22.0 / 7' obtiene 3.1428 como respuesta. Si usa una escala de 8, obtiene 3.14285714, que son 8 números después del punto flotante. Entonces la escala es un factor de precisión