UNIX shell脚本中的浮点算法

时间:2013-01-08 19:07:42

标签: shell unix math floating-point

如何在shell脚本中使用浮点数(例如 1.503923 )进行算术运算?浮点数作为字符串从文件中提取。该文件的格式如下:

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

4 个答案:

答案 0 :(得分:9)

我相信你应该使用:bc

例如:

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

(这是unix的方式:每个工具都专注于做他们应该做的事情,他们都在一起做伟大的事情。不要模仿另一个伟大的工具,让他们一起工作。)

输出:

.3574879198

或缩放为1而不是10

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

输出:

.3

请注意,这不会执行舍入。

答案 1 :(得分:6)

这个怎么样?

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

这将使bc添加$ String2和$ String8的值,并将结果保存在变量calc中。

答案 2 :(得分:6)

如果你没有“bc”,你可以使用'awk':

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

答案 3 :(得分:2)

bc中的刻度是精确度,因此如果键入bc<<<<<<<<< 'scale = 4; 22.0 / 7'你得到3.1428作为答案。如果使用8的标度,则得到3.14285714,即浮点后的8个数字。 所以规模是一个精确因素