PDA

View Full Version : Calcolo della media tramite script bash


fracarro
21-07-2006, 09:26
Salve ragazzi. Ho un problemino nella creazione di uno script bash per il calcolo della media di alcuni valori restituiti da un programma. Mi spiego meglio. Io dovrei lanciare n_iter volte un programma e ogni volta "prelevare" dal suo output un valore, sommarlo a quelli precedenti e alla fine fare la divisione per n_iter. Io ho scritto il seguente script:

#!/bin/bash
n_iter=5
counter=0
media=0
x=0
while [ $counter -lt $n_iter ]
do
counter=`expr $counter + 1`
x=`./dikh <input_file -p 50 | egrep Running | awk '{printf ($6"\n")}'`
echo "x=" $x
media=`expr $media + $x`
done
media=`expr $media / $n_iter`

Il problema che mi da deriva dal fatto che quando estraggo il valore del risultato dallo standard output tramite la grep e l'awk e lo salvo nella variabile x quest'ultima viene considerata come una stringa e di conseguenza la successiva operazione media=`expr $media + $x`mi restituisce un errore perchè i parametri non sono numerici. C'è un modo per convertire la stringa in numero tipo con la funzione atoi del C? Oppure c'è un modo migliore per prelevare direttamente come un numero il valore dell'output del programma? ( Per la cronaca l'output viene scritto in questo modo " Running time of SP computation: 12.33 " e a me servirebbe salvare in x il 12.33 in formato numerico ). Grazie per l'aiuto.

ilsensine
21-07-2006, 10:07
Bash non supporta i numeri in virgola mobile. Devi usare bc:
http://db.ilug-bom.org.in/Documentation/abs-guide/mathc.html#BCREF

andbin
21-07-2006, 10:17
Il problema che mi da deriva dal fatto che quando estraggo il valore del risultato dallo standard output tramite la grep e l'awk e lo salvo nella variabile x quest'ultima viene considerata come una stringa e di conseguenza la successiva operazione media=`expr $media + $x`mi restituisce un errore perchè i parametri non sono numerici.Partiamo da una considerazione: expr è un eseguibile (tipicamente /usr/bin/expr) a cui si passano una serie di parametri che vengono presi a tutti gli effetti come stringhe! Il problema fondamentale quindi non è il fatto che i valori nello script siano numeri o stringhe (per expr è indifferente!) ma è che il comando expr non accetta numeri con la virgola ma solo numeri interi.
-bash-2.05b$ expr 15 + 8
23
-bash-2.05b$ expr 15.5 + 8
expr: non-numeric argument

ilsensine
21-07-2006, 10:22
Partiamo da una considerazione: expr è un eseguibile (tipicamente /usr/bin/expr) a cui si passano una serie di parametri che vengono presi a tutti gli effetti come stringhe! Il problema fondamentale quindi non è il fatto che i valori nello script siano numeri o stringhe (per expr è indifferente!) ma è che il comando expr non accetta numeri con la virgola ma solo numeri interi.

Corollario: sotto Bash, expr non serve a un tubo -- bash supporta l'aritmetica sugli interi: echo $((9/3+2))

fracarro
28-07-2006, 10:35
grazie mille. ho tagliato la testa al toro e usato uno script perl.