Script de Shell: ¿Cómo devolver el valor máximo en una matriz?

Script de Shell: ¿Cómo devolver el valor máximo en una matriz?

Tengo una matriz:

ARRAY=(12.5 6.2)

Deseo devolver el valor máximo en ARRAY queLa salida es 12,5

¿Alguien puede compartirme ideas?

He probado esto:

max=0
for v in ${ARRAY[@]}; do
    if (( $v > $max )); then max=$v; fi; 
done
echo $max

Pero me devuelve:

((: 12.5 > 0 : syntax error: invalid arithmetic operator (error token is ".5 > 0 ")
((: 6.2 > 0 : syntax error: invalid arithmetic operator (error token is ".2 > 0 ")

Respuesta1

printf '%s\n' "${ARRAY[@]}" |
awk '$1 > m || NR == 1 { m = $1 } END { print m }'

Dado que el bashshell no realiza aritmética de punto flotante, es más fácil comparar números de punto flotante en otro idioma. Aquí lo estoy usando awkpara encontrar el máximo de todos los elementos de la ARRAYmatriz.

El printfcomando generará cada elemento de la matriz en su propia línea y el awkcódigo actualizará su mvalor para que sea el máximo de los valores vistos hasta ahora. Al final, mse imprime el valor.

La prueba on NR == 1será verdadera para la primera línea leída por el awkprograma e inicializará el valor de mal primer valor de la matriz (algo que usted no puede hacer, lo que significa que su código habría regresado 0para una matriz con todos los valores negativos). números, si hubiera funcionado).

Respuesta2

Si desea hacer aritmética de punto flotante, deberá cambiar a ksh93, zsh o yash (o fishsi está listo para alejarse de los shells tipo Bourne), bashno los admite.

Para una sintaxis compatible con los 3 shells:

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[@]}"

(Necesita una versión reciente de zshfor inf/ nanpara ser compatible. Las variaciones en mayúsculas y minúsculas son compatibles con los 3 ( INF, NaN, Inf...), pero solo yashadmite ortografías alternativas como Infinity; 0x12p34los tipos de números zshaún no son compatibles. Tenga en cuenta que si 010significa 10 u 8 depende del shell y su configuración)

información relacionada