3

bashに配列があります。例えば

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

最小数、この場合は 3 の位置を返す方法を知りたいです。

4

4 に答える 4

4

これを試して:

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
于 2013-05-17T13:41:28.897 に答える
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

位置だけを取得します。

于 2013-05-17T13:43:57.443 に答える
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

于 2013-05-17T19:40:15.910 に答える
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"; } '
于 2013-05-17T13:47:35.783 に答える