2015-09-07 4 views
0

Я хотел бы отсортировать элементы в списке по второму и третьему символу элементов в обратном порядке, т.е. сортировать по 3-му символу сначала, а затем по 2-му символу.Bash - сортировка по подстроке элементов

например. Если есть массив как этот

array=(XA11000 XB21000 XA31000 XB12000)

Нужный выход рода будет (XA31000 XB21000 XB12000 XA11000)

Это относительно просто без 4-х цифр в конце каждого элемента в качестве

echo "${array[@]}"|rev | sort -r | rev

будет работать.

Однако я не слишком уверен, как это будет работать с цифрами в конце. Какие-либо предложения?

+0

Я могу просто быть медленным, но совершенно непонятно, какой порядок сортировки вы хотите? 'sort ... вторым и третьим символом элементов в обратном порядке, т. е. сортировать по 3-му символу сначала, а затем по 2-му символу.« Означает ли это «второй и третий символ» после обратного игнорирования ведущего «000»? ... и .. ваше объяснение «3-й символ первым, а затем 2-й символ» будет применяться без обращения вспять? –

+0

Извините, должно быть, было более ясно. Я имел в виду, что я хотел бы сначала обработать результат сортировки третьего символа в порядке убывания, затем передать результат и отсортировать второй символ в порядке убывания. – Zocr

ответ

3

sort имеет возможность -k, где можно указать, как сортировать:

( IFS=$'\n' 
    echo "${array[*]}" | sort -k1.3,1.3r -k1.2,1.2r 
) 

т.е. сортировать по подстроке из первого слова третьего символа (-k1.3) до первого слова третьего символа (,1.3) обращенной r, вторичный сортировка по первому слову второго символа.

+0

Тупой вопрос, что делают круглые скобки? Просто любопытно. Хороший ответ +1 –

+0

создает подоболочку, поэтому изменение IFS не распространяется вне его – BroSlow

+0

@ l'L'l: все это работает в подоболочке, чтобы локализовать изменение в IFS (которое разделяет элементы массива на новые строки) , – choroba

Смежные вопросы