2012-03-05 170 views
3

如何从shell脚本中的数组中找到最大元素及其索引。我有一个阵列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); 

此外,我们还怎么能有多维数组,并得到最小和最大元素的索引和价值。

回答

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 
+0

上面的代码适用于我的计算机。但奇怪的是,当我在远程计算机上运行它时,它只是返回第一个元素的第一个索引和值。你认为什么可以解释这一点? – 2013-03-16 23:49:42

+0

我总是得到第一个索引值,但是不同的元素。例如,如果我有x = '19 21 23',我会将$ I看作23,但将$ C看作1,尽管它明显是元素3。 – StatsSorceress 2017-07-25 20:22:00

0

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使用壳特定构建体。如果你打算使用sh,甚至应该避免使用数组,因为并不是所有的shell都支持它们。如果你想使用非标准shell的语言特性,你不妨使用perl,python,ruby或者你选择的语言。