首页 > 解决方案 > 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/ Ysi_br_X Isine_R0/core blah_1_X11Y2_R0/Isi_bl_X17 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_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

谢谢

标签: listsortingtcl

解决方案


这听起来几乎像是 的工作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

如果这不是很正确,那么选择排序规则键的更复杂的方法应该可以解决问题。


推荐阅读