Арифметика с плавающей точкой в ​​оболочке UNIX script

Как сделать арифметику с числами с плавающей запятой, такими как 1.503923 в оболочке script? Номера с плавающей запятой извлекаются из файла в виде строки. Формат файла выглядит следующим образом:

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

Вот несколько упрощенных примеров кода, которые мне нужно получить. Все работает отлично до арифметики. Я вытаскиваю строку из файла, а затем вытягиваю несколько значений из этой строки. Я думаю, что это сократит время обработки поиска, поскольку эти файлы огромны.

# 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

Выход, который я получаю:

expr: non-numeric argument
command not found

Ответы

Ответ 1

Как насчет этого?

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

Это приведет к тому, что bc добавит значения $String2 и $String8 и сохранит результат в переменной calc.

Ответ 2

Я считаю, что вы должны использовать: bc

Например:

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

(Это единственный способ: каждый инструмент специализируется на том, чтобы хорошо делать то, что должен, и все они работают вместе, чтобы делать великие дела. Не эмулируйте отличный инструмент с другим, заставьте их работать вместе.)

Выход:

.3574879198

Или со шкалой 1 вместо 10:

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

Выход:

.3

Обратите внимание, что это не выполняет округление.

Ответ 3

Если у вас нет "bc", вы можете использовать "awk":

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

Ответ 4

шкала в bc представляет собой прецессию, поэтому с шкалой 4, если вы наберете bc < 'scale = 4; 22.0/7' вы получите 3.1428 в качестве ответа. Если вы используете шкалу из 8, вы получаете 3.14285714, которая составляет 8 чисел после с плавающей запятой. Таким образом, масштаб является коэффициентом прецессии