Shell Script - как вернуть максимальное значение в массиве?

Другое решение awk :

$ awk '
FNR==NR {
    a[$1] = $2;
    c[$1] = $1;
    next;
}
{
    b[$1] = $2;
    c[$1] = $1;
}   
END {
    printf "type\tvalue1\tvalue2\tdifference\n";
    for(i in c)
        printf "%s\t%d\t%d\t%d\n", i, a[i], b[i], a[i]-b[i]
}' file1 file2
type    value1  value2  difference
remark  2       240     -238
test    27      0       27
viewer  23      2990    -2967
exam    0       200     -200
1
17.01.2019, 08:37
2 ответа
printf '%s\n' "${ARRAY[@]}" |
awk '$1 > m || NR == 1 { m = $1 } END { print m }'

Поскольку оболочка bashне выполняет арифметические операции с плавающей запятой, проще сравнивать числа с плавающей запятой на другом языке. Здесь я использую awk, чтобы найти максимум всех элементов в массиве ARRAY.

Команда printfвыведет каждый элемент массива на отдельной строке, а код awkобновит его значение m, чтобы оно стало максимальным из просмотренных до сих пор значений. В конце печатается значение m.

Проверка на NR == 1будет истинной для первой строки, прочитанной программой awk, и инициализирует значение mпервым значением массива (, что вы не можете сделать, это означает, что ваш код вернул бы 0для массива со всеми отрицательными числами, если бы он работал ).

2
27.01.2020, 23:31

Если вы хотите выполнять арифметику с плавающей запятой, вам нужно переключиться на ksh93, zsh или yash (или fish, если вы готовы уйти от Борна -, как оболочки ), bashих не поддерживает.

Для синтаксиса, совместимого со всеми 3 оболочками:

max() {
  [ "$#" -gt 0 ] || return
  typeset i max="$1"; shift
  for i do
    if [ "$((i > max))" -ne 0 ]; then
      max=$i
    fi
  done
  printf '%s\n' "$max"
}
array=(12.5 6.2 nan 0xfff -inf inf -1e12 1e20)
max "${array[@]}"

(вам нужна последняя версия zshдля поддержки inf/ nan. Варианты регистра поддерживаются во всех 3 (INF, NaN, Inf... ), но только yashподдерживает альтернативные варианты написания, такие как Infinity; Типы номеров 0x12p34еще не поддерживаются zsh.Имейте в виду, что 010означает 10 или 8, зависит от оболочки и ее конфигурации )

.
0
27.01.2020, 23:31

Теги

Похожие вопросы