#list #sorting #tcl
#Список #сортировка #tcl
Вопрос:
Как мне сделать это в tcl, скажем, у меня есть список $ list1, содержащий 5 таких записей blah_1_X11Y2_R0/Isi_bl_X8 Y0/ wrap_bl_X0Y0_R0/Isine_MY / core blah_1_X 13 Y2_R0/Isi_bl_X5 Y0/ wrap_bl_X0Y0_R0/Isine_MY /core blah_1_X11Y2_R0/Isi_br_X7 Y0/оболочка_br_x1y0_r0/Isine_R0 / ядро
blah_1_X11Y2_R0/Isi_bl_X17 Y0/оболочка_bl_x0y0_r0/Isine_MY/ядроblah_1_X11Y2_R0/Isi_br_X15 Y0/wrap_br_X1Y0_R0/Isine_R0/core
Я хочу отсортировать их численно и вывести примерно так
blah_1_X11Y2_R0/Isi_br_**X7**Y0/wrap_br_X1Y0_R0/Isine_R0/core
blah_1_X11Y2_R0/Isi_bl_**X8**Y0/wrap_bl_X0Y0_R0/Isine_MY/core
blah_1_X11Y2_R0/Isi_br_**X15**Y0/wrap_br_X1Y0_R0/Isine_R0/core
blah_1_X11Y2_R0/Isi_bl_**X17**Y0/wrap_bl_X0Y0_R0/Isine_MY/core
blah_1_**X13**Y2_R0/Isi_bl_**X5**Y0/wrap_bl_X0Y0_R0/Isine_MY/core
Спасибо
Ответ №1:
Это звучит почти как задание lsort -dictionary
, но нам нужно немного поработать, чтобы извлечь числовые части, потому что мы, похоже, не хотим сортировать по нечисловым частям. (Я предполагаю, что у вас есть ваши данные в вызываемой переменной списка data
.)
# Extract the parts we want to sort on
set nums [lmap item $data {
# The collation key is a list of all digit sequences in the input value
regexp -all -inline {d } $item
}]
# Sort and remap back onto the original data
set sorted_data [lmap idx [lsort -dictionary -indices $nums] {
lindex $data $idx
}]
Эта -indices
опция очень полезна, когда у вас есть ключ сортировки (то, что вы извлекли из данных, по которым хотите выполнить сортировку), поскольку это означает, что вам не нужно заархивировать это в исходные данные для выполнения сортировки. И lmap
это просто так полезно для такого рода вещей.
Ключ сортировки, извлеченный из:
blah_1_X11Y2_R0/Isi_bl_X8Y0/wrap_bl_X0Y0_R0/Isine_MY/core
является:
1 11 2 0 8 0 0 0 0
И я думаю, что ваши данные сортируются как:
blah_1_X11Y2_R0/Isi_br_X7Y0/wrap_br_X1Y0_R0/Isine_R0/core
blah_1_X11Y2_R0/Isi_bl_X8Y0/wrap_bl_X0Y0_R0/Isine_MY/core
blah_1_X11Y2_R0/Isi_br_X15Y0/wrap_br_X1Y0_R0/Isine_R0/core
blah_1_X11Y2_R0/Isi_bl_X17Y0/wrap_bl_X0Y0_R0/Isine_MY/core
blah_1_X13Y2_R0/Isi_bl_X5Y0/wrap_bl_X0Y0_R0/Isine_MY/core
Если это не совсем правильно, то более сложный метод выбора ключа сопоставления должен сделать свое дело.
Комментарии:
1. Во входных данных отсутствуют какие-либо
*
символы; Я полностью признаю, что вырезал-вставил с наименьшими возможными усилиями!2. Спасибо, Донал. Я обязательно попробую это сделать