【问题标题】:Maximum element and its indices from an array in shell scriptshell脚本中数组的最大元素及其索引
【发布时间】:2012-03-22 21:49:16
【问题描述】:

如何从 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);

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

【问题讨论】:

    标签: arrays bash shell scripting multidimensional-array


    【解决方案1】:
    $ 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
    

    【讨论】:

    • 以上代码适用于我的电脑。但奇怪的是,当我在远程计算机上运行它时,它只返回第一个索引和第一个元素的值。你认为这可以解释什么?
    • 我总是得到第一个索引值,但是不同的元素。例如,如果我有 x='19 21 23',我将得到 $I 作为 23 但 $C 作为 1,即使它显然是元素 3。
    【解决方案2】:

    一般来说,Shell 脚本根本不支持数组,因此您要求的内容是不可能的。我不知道有任何 shell 支持多维数组,但有些 shell 确实为一维数组提供了最低限度的支持。其中一些 shell 可能提供了方便的方法来执行您需要的操作。要在 bash 中找到最大值和索引,这是一个为数组提供原始支持的特定 shell,您需要遍历数组(据我所知)。但是,bash 对浮点值没有很好的支持,所以在实现它之前,您应该考虑使用不同的语言。这是一种方法的示例:

    idx=0 maxidx=0 最大值=${a[0]} 对于 ${a[@]} 中的 v;做 expr $v \> $max > /dev/null && { maxidx=$idx;最大=$v; } : $((idx++)) 完毕

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-20
      • 2020-07-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多