我有一个array=(4,2,8,9,1,0)
,并且我不想对数组进行排序以找到数组中的最高编号,因为我需要按原样获取最高编号的索引值,因此可以使用它供进一步参考。
预期输出:
9 index value => 3
有人可以帮助我实现这一目标吗?
答案 0 :(得分:2)
使用三元条件运算符的循环略有变化,并且不假设值的范围:
arr=(4 2 8 9 1 0)
max=${arr[0]}
maxIdx=0
for ((i = 1; i < ${#arr[@]}; ++i)); do
maxIdx=$((arr[i] > max ? i : maxIdx))
max=$((arr[i] > max ? arr[i] : max))
done
printf '%s index => values %s\n' "$maxIdx" "$max"
唯一的假设是数组索引是连续的。如果不是这样,它将变得更加复杂:
arr=([1]=4 [3]=2 [5]=8 [7]=9 [9]=1 [11]=0)
indices=("${!arr[@]}")
maxIdx=${indices[0]}
max=${arr[maxIdx]}
for i in "${indices[@]:1}"; do
((arr[i] <= max)) && continue
maxIdx=$i
max=${arr[i]}
done
printf '%s index => values %s\n' "$maxIdx" "$max"
这首先将索引放入一个单独的数组中,并将初始最大值设置为与第一个索引对应的值;然后,对索引进行迭代,跳过第一个索引(:1
表示法),检查当前元素是否为新的最大值,如果是,则存储索引和最大值。
答案 1 :(得分:1)
不使用sort
,就可以在shell中使用简单的循环。这是示例bash
代码:
#!/usr/bin/env bash
array=(4 2 8 9 1 0)
for i in "${!array[@]}"; do
[[ -z $max ]] || (( ${array[i]} > $max )) && { max="${array[i]}"; maxind=$i; }
done
echo "max=$max, maxind=$maxind"
max=9, maxind=3
答案 2 :(得分:1)
arr=(4 2 8 9 1 0)
paste <(printf "%s\n" "${arr[@]}") <(seq 0 $((${#arr[@]} - 1)) ) |
sort -k1,1 |
tail -n1 |
sed 's/\t/ index value => /'
printf
seq
paste
sort
tail -n1
sed
将选项卡替换为所需的输出字符串。一个人可以使用ex。 cut -d, -f2
仅获取索引或使用read a b <( ... )
将数字读入变量等。答案 3 :(得分:0)
使用Perl
$ export data=4,2,8,9,1,0
$ echo $data | perl -ne ' map{$i++; if($_>$x) {$x=$_;$id=$i} } split(","); print "max=$x", " index=",--${id},"\n" '
max=9 index=3
$