bash,返回数组中最小条目的位置

时间:2013-05-17 13:21:24

标签: arrays bash

我在bash中有一个数组。例如

array=(1 3 4e-10 6 4 2e-4 7 5 2 9) 

我想知道如何返回最小数字的位置,在这种情况下为3.

4 个答案:

答案 0 :(得分:3)

试试这个:

arr=(1 3 4e-10 6 4 2e-4 7 5 2 9)

表示最小值和位置

echo "${arr[@]}" | tr -s ' ' '\n' | awk '{print($0" "NR)}' |
sort -g -k1,1 | head -1
4e-10 3

表示最小值的位置

echo "${arr[@]}" | tr -s ' ' '\n' | awk '{print($0" "NR)}' |
sort -g -k1,1 | head -1 | cut -f2 -d' '
3

答案 1 :(得分:3)

$ array=(1 3 4e-10 6 4 2e-4 7 5 2 9)
$ echo "${array[*]}" | tr ' ' '\n' | awk 'NR==1{min=$0}NR>1 && $1<min{min=$1;pos=NR}END{print min,pos}'
4e-10 3

或只是

$ echo "${array[*]}" | tr ' ' '\n' | awk 'NR==1{min=$0}NR>1 && $1<min{min=$1;pos=NR}END{print pos}'
3

获得该职位。

答案 2 :(得分:1)

就像评论说的那样,Bash不做浮动。我循环遍历数组并使用perl或awk。这样的事情应该有效:

for i in ${array[@]}; do echo $i; done | perl -e 'use strict; my @array; while(<STDIN>) { chomp $_; push (@array,$_+0); } foreach my $number (sort {$a <=> $b} @array) { print "$number\n"; } '

答案 3 :(得分:1)

bash和perl的非常“线性噪音”组合

array=(1 3 4e-10 6 4 2e-4 7 5 2 9)
perl -lanE '
    say 1 + (sort {$a->[1] <=> $b->[1]} map {[$_, $F[$_]]} 0..$#F)[0]->[0] 
' <<< "${array[@]}"

输出3