Aritmetica in virgola mobile nello script della shell UNIX

Come fare l’aritmetica con numeri in virgola mobile come 1.503923 in uno script di shell? I numeri in virgola mobile vengono estratti da un file come una stringa. Il formato del file è il seguente:

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

Ecco un codice di esempio semplificato che ho bisogno di lavorare. Tutto funziona bene fino all’aritmetica. Estraggo una riga dal file, quindi estraggo più valori da quella linea. Penso che questo ridurrebbe il tempo di elaborazione della ricerca dato che questi file sono enormi.

 # 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 

Uscita continuo a ottenere:

 expr: non-numeric argument command not found 

Che dire di questo?

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

Ciò farà sì che bc aggiunga i valori di $ String2 e $ String8 e salvi il risultato nel calcolo della variabile.

Credo che dovresti usare: bc

Per esempio:

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

(È il modo unix: ogni strumento è specializzato nel fare bene ciò che dovrebbero fare e tutti lavorano insieme per fare grandi cose, non emulare un ottimo strumento con un altro, farli lavorare insieme).

Produzione:

 .3574879198 

O con una scala di 1 invece di 10 :

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

Produzione:

 .3 

Si noti che questo non esegue l’arrotondamento.

Se non hai il “bc” puoi usare “awk”:

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

la scala in bc è la precisione quindi con una scala di 4 se si digita bc <<< 'scale = 4; 22.0 / 7' si ottiene 3.1428 come risposta. Se usi una scala di 8 ottieni 3,14285714 che è 8 numeri dopo il virgola mobile. Quindi la scala è un fattore di precessione