
¿Cómo se ordena una matriz en función de una subcadena de cada elemento?
por ejemplo, dada una matriz como
arr=( 2some05stuff 4more02stuff 3evenmore01stuff 1no04stuff )
Me gustaría ordenar los elementos por la cadena numérica que precede stuff
para terminar con
3evenmore01stuff
4more02stuff
1no04stuff
2some05stuff
Sé que la expansión de parámetros marca o
/ O
reordena una matriz, por ejemplo
imprimir -rl "${(@on)arr}"
1no04stuff
2some05stuff
3evenmore01stuff
4more02stuff
y
imprimir -rl "${(@On)arr}"
4more02stuff
3evenmore01stuff
2some05stuff
1no04stuff
Simplemente no sé si es posible combinarlos con una función u otra expansión de parámetros como, por ejemplo, la eliminación de subíndices o la expansión de subíndices...
Respuesta1
No conozco una manera de hacer esto en línea. Con los calificadores globales, puede especificar una clave de clasificación ( *(oe\''REPLY=${${REPLY%stuff*}##*[^0-9]}'\')
), pero no existe tal cosa con los modificadores de expansión de parámetros.
Lo que puede hacer es crear una matriz auxiliar que contenga ${sort_key}$'\0'${value}
, es decir, agregar un byte nulo y el valor original a la clave de clasificación. Suponiendo que las claves de clasificación no contienen bytes nulos, ordenar esa matriz proporciona el orden deseado y eliminar el prefijo de la clave de clasificación proporciona el resultado deseado.
typeset -a tmp; tmp=(); typeset -i i
for ((i=1; i<=$#arr; i++)); do tmp[$i]=${${arr[$i]%stuff*}##*[^0-9]}$'\0'$arr[$i]; done
print -lr "${(@)${(@o)tmp}#*$'\0'}"