Как найти максимальное значение в массиве без использования сортировки cmd в сценарии оболочки - PullRequest
0 голосов
/ 10 декабря 2018

У меня есть array=(4,2,8,9,1,0), и я не хочу сортировать массив, чтобы найти наибольшее число в массиве, потому что мне нужно получить значение индекса наибольшего числа, как оно есть, поэтому я могу использовать его для дальнейшегоссылка.

Ожидаемый результат:

 9 index value => 3

Может ли кто-нибудь помочь мне добиться этого?

Ответы [ 4 ]

0 голосов
/ 10 декабря 2018

Использование 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
$
0 голосов
/ 10 декабря 2018

Небольшая вариация с циклом, использующим троичный условный оператор и без предположений о диапазоне значений:

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), проверяет, является ли текущий элемент новым максимумом, и если это так, сохраняет индекс и максимум.

0 голосов
/ 10 декабря 2018
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 => /'
  1. Печать каждого элемента массива на новой строке с помощью printf
  2. Печать индексов массива с помощью seq
  3. Объединение обоих потоков с использованием paste
  4. Числовая сортировка строк с использованием первых полей (т. Е. Значения массива) sort
  5. Печать последней строки tail -n1
  6. Значение массива и результат разделяются табуляцией.Замените вкладку желаемой выходной строкой, используя sed.Можно использовать бывший.cut -d, -f2 чтобы получить только индекс или использовать read a b <( ... ) для чтения чисел в переменные и т. Д.
0 голосов
/ 10 декабря 2018

Без использования sort вы можете использовать простой цикл в оболочке.Вот пример 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...