Tcl несколько числовых запусков в одной строке

#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. Спасибо, Донал. Я обязательно попробую это сделать