list - 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
谢谢
解决方案
这听起来几乎像是 的工作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
如果这不是很正确,那么选择排序规则键的更复杂的方法应该可以解决问题。
推荐阅读
- batch-rename - 使用计算批量重命名文件
- python - 如何通过 python 请求与 salesforce 联系?
- python - 由多进程启动时功能不起作用
- javascript - 世博会联系人返回部分结果 - 缺少联系人
- postgresql - 如何通过 PostgreSQL 查询 odoo 14 从日期时间字段更新浮点字段中的时间
- java - Freemarker 以下已评估为 null 或缺失
- c# - 如何修复 Azure 管道错误 NETSDK1152?
- redis - 在 redis / sentinel 中设置身份验证密码,停机时间为零
- javascript - zustand:更改存储对象中的参数值
- java - 产品减去按钮在电子商务应用程序中无法正常工作