
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 bash
shell 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 awk
para encontrar el máximo de todos los elementos de la ARRAY
matriz.
El printf
comando generará cada elemento de la matriz en su propia línea y el awk
código actualizará su m
valor para que sea el máximo de los valores vistos hasta ahora. Al final, m
se imprime el valor.
La prueba on NR == 1
será verdadera para la primera línea leída por el awk
programa e inicializará el valor de m
al primer valor de la matriz (algo que usted no puede hacer, lo que significa que su código habría regresado 0
para 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 fish
si está listo para alejarse de los shells tipo Bourne), bash
no 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 zsh
for inf
/ nan
para ser compatible. Las variaciones en mayúsculas y minúsculas son compatibles con los 3 ( INF
, NaN
, Inf
...), pero solo yash
admite ortografías alternativas como Infinity
; 0x12p34
los tipos de números zsh
aún no son compatibles. Tenga en cuenta que si 010
significa 10 u 8 depende del shell y su configuración)