将字符串解析为浮点数数组

时间:2015-01-31 23:04:32

标签: bash parsing

我希望在BASH中创建一个浮点数数组(称为b),通过解析以下变量adse来给出数组的内容:

echo $adse
16.92 18.29 19.18 20.87 2.78 2.88 2.77 2.83 2.80 2.78 2.73 2.73 2.75 2.93 2.91 2.93 2.77 4.64 2.67 3.01 6.78

使b [1] = 16.92; B [2] = 18.29 .....

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:5)

使用

b=($adse)

你得到一个bash数组b。可以使用${b[index]}访问单个参数。指数从零开始,因此第一个元素是${b[0]}

请注意,在bash中你会发现很难对这些值做任何事情。使用支持浮点计算的脚本语言(如Perl或Python)可能是个好主意。

有关bash数组的更深入讨论,请参阅this link

答案 1 :(得分:4)

规范解决方案是:

read -r -d '' -a b <<<"$adse"

与依赖于$adse的不带引号扩展的默认分词的解决方案不同,内置的read不会产生不必要的全局字符扩展。

如果要将变量拆分为空白以外的某个字符,可以在本地为IFS设置read

IFS=: read -r -d '' -a b <<<"$adse"

这不会在换行符上分开。如果您想在冒号或换行符上拆分,可以使用IFS=$':\n'

以上两者都会将b[0]设置为第一个元素,而不是b[1]。如果您想从b[1]开始,可以将0或其他内容添加到read的输入中,然后再添加unset "b[0]"

help read获取选项的解释。简而言之,-r避免了对反斜杠转义序列的解释; -d ''导致read在输入结束而不是行结束时终止,而-a b会将结果放在数组b中。

答案 2 :(得分:1)

尝试:

b=($(echo $adse))

但它从索引0开始,如:

echo ${b[0]}

产生:

16.92

答案 3 :(得分:1)

虽然有一个简单的解决方案可以达到你想要的效果,但我相信如果你有一个字符串的分隔符不是空格,那么以下内容也很有用:

b=()
adse="16.92 18.29 19.18 20.87 2.78 2.88 2.77 2.83 2.80 2.78 2.73 2.73 2.75 2.93 2.91 2.93 2.77 4.64 2.67 3.01 6.78"

b=(${adse// / })

例如,如果您有这样的字符串:

adse="16.92:18.29...etc"

您必须将b=(${adse// / })更改为:

b=(${adse//:/ })

但是,对于您的特定情况,下面的Birei已经说明了将字符串解析为数组所需的全部内容。