shell脚本中数组的最大元素及其索引

时间:2012-03-05 12:07:55

标签: arrays bash shell scripting multidimensional-array

如何在shell脚本中从数组中找到最大元素及其索引。我有一个数组

a = [-2.2116565098 -2.1238242060 -2.1747941240 -2.3201010162 -2.3677779871 -1.8126464132 -2.1247209755 -2.1190930712 -2.3242384636 -2.1081702064];

现在,我想在bash脚本中找到最大值及其索引。有没有Matlab中的快捷方式

[C, I] = max(a);

另外,我们如何才能拥有多维数组并获得最小和最大元素的索引和值。

2 个答案:

答案 0 :(得分:3)

$ x='-2.2116565098 -2.1238242060 -2.1747941240 -2.3201010162 -2.3677779871'
$ IC=(`tr ' ' '\n' <<<$x | cat -n | sort -k2,2nr | head -n1`)
$ I=${IC[0]} C=${IC[1]}
$ echo $I $C
2 -2.1238242060

答案 1 :(得分:0)

Shell脚本通常根本不支持数组,所以你要求的是不可能的。我不知道任何支持多维数组的shell,但有些shell确实为一维数组提供了最小的支持。其中一些shell可能提供了执行所需操作的便捷方法。要在bash中找到最大值和索引,这是一个为数组提供原始支持的特定shell,你需要遍历数组(据我所知)。但是,bash不能为浮点值提供良好的支持,因此在实现之前,应考虑使用其他语言。以下是一种方法的示例:

idx=0
maxidx=0
max=${a[0]}
for v in ${a[@]}; do
    expr $v \> $max > /dev/null && { maxidx=$idx; max=$v; }
    : $((idx++))
done

bash中可能有更好的技术来访问数组,但IMO使用shell特定结构通常是个坏主意。如果你打算使用sh,甚至应该避免使用数组,因为不是所有的shell都支持它们。如果你想使用非标准shell的语言特性,你也可以使用perl,python,ruby或你选择的语言。