Classificando uma matriz com base na substring de cada elemento

5

Como se classifica uma matriz com base em uma substring de cada elemento?
por exemplo. dado um array como

arr=( 2some05stuff 4more02stuff 3evenmore01stuff 1no04stuff )

Eu gostaria de classificar os elementos pela string numérica que precede stuff , então acabo com

3evenmore01stuff
4more02stuff
1no04stuff
2some05stuff

Eu sei que os sinalizadores de expansão de parâmetro o / O reordenam uma matriz, por exemplo,

print -rl "${(@on)arr}"
1no04stuff
2some05stuff
3evenmore01stuff
4more02stuff

e

print -rl "${(@On)arr}" 
4more02stuff
3evenmore01stuff
2some05stuff
1no04stuff

Não sei se é possível combiná-los com uma função ou outra expansão de parâmetro como, por exemplo, expansão de subscrição ou subscrição de subscrito ...

    
por don_crissti 15.12.2016 / 23:09

1 resposta

3

Eu não sei como fazer isso inline. Com os qualificadores globs, você pode especificar uma chave de classificação ( *(oe\''REPLY=${${REPLY%stuff*}##*[^0-9]}'\') ), mas não existe nada com modificadores de expansão de parâmetro.

O que você pode fazer é criar uma matriz auxiliar contendo ${sort_key}$'%code%'${value} , ou seja, acrescentar um byte nulo e o valor original à chave de classificação. Supondo que as chaves de ordenação não contenham bytes nulos, ordenar essa matriz dá a ordem desejada e retirar o prefixo da chave de ordenação dá o resultado desejado.

typeset -a tmp; tmp=(); typeset -i i
for ((i=1; i<=$#arr; i++)); do tmp[$i]=${${arr[$i]%stuff*}##*[^0-9]}$'
typeset -a tmp; tmp=(); typeset -i i
for ((i=1; i<=$#arr; i++)); do tmp[$i]=${${arr[$i]%stuff*}##*[^0-9]}$'%pre%'$arr[$i]; done
print -lr "${(@)${(@o)tmp}#*$'%pre%'}"
'$arr[$i]; done print -lr "${(@)${(@o)tmp}#*$'%pre%'}"
    
por 16.12.2016 / 01:46

Tags