Executa aritmética de ponto flutuante em definições de variável de script de shell [duplicado]

5

Eu entendo bash e alguns outros intérpretes só realizam aritmética para inteiros. No seguinte for loop, como posso fazer isso? Eu li que bc pode ser usado, mas não tenho certeza de como usar bc nessa situação.

total=0
for number in 'cat /path/to/file'; do
        total=$(($total+$number))
done
average=$(($total/10))
echo Average is $average
arquivo

:

1.143362
1.193994
1.210489
1.210540
1.227611
1.243496
1.260872
1.276752
1.294121
1.427371
    
por John B 16.05.2013 / 15:12

4 respostas

11

Você pode não querer usar bc para isso. Talvez awk funcione melhor:

awk '{sum+=$1};END{print sum/NR}' /path/to/file
    
por 16.05.2013 / 15:25
8

Como marcado , aqui está uma alternativa bash 4.0 resposta da choroba , para evitar wc e sed :

bash-4.2$ mapfile -t a < file

bash-4.2$ (IFS='+'; echo "(${a[*]})/${#a[@]}") | bc -l
1.24886080000000000000
    
por 16.05.2013 / 15:33
3

Eu costumo usar bc para aritmética de ponto flutuante:

file=1.txt
echo '('$(<$file)')/'$(wc -l < $file) | sed 's/ /+/g' | bc -l
    
por 16.05.2013 / 15:25
0
term=0
file=input
for number in 'cat "$file"'; do
        term="${term}+${number}"
done
total="$(echo "$term" | bc -l)"
average="$(echo "${total}/10" | bc -l)"
average="$(echo "$average" | sed -e 's/^\(.*\..*[^0]\)0*//' -e p)"
echo "Total: ${total}"
echo "Average: ${average}"
    
por 16.05.2013 / 15:31