寻找一种通过n个最后一个字符来输入字符串列表的方法。
期望的结果:
lsort -lastchars 3 {123xyz 456uvw 789abc}
789abc 456uvw 123xyz
我的后退位置是使用-command选项并写我的proc丢弃除最后3个字符以外的所有字符。
谢谢, 格特
答案 0 :(得分:2)
你的后备想法是实现这一目标的方法。
proc f {lhs rhs} {
return [string compare [string range $lhs end-2 end] \
[string range $rhs end-2 end]]
}
lsort -command f {123xyz 456uvw 789abc}
返回
789abc 456uvw 123xyz
答案 1 :(得分:2)
快速执行此操作的方法是计算归类键并对其进行排序。排序规则键只是一个按您想要的顺序排序的字符串;你用真实值对它们进行打包以对它们进行排序和排序。
set yourList {123xyz 456uvw 789abc}
set withCKs {}
foreach value $yourList {
lappend withCKs [list $value [string range $value end-2 end]]
}
set sorted {}
foreach pair [lsort -index 1 $withCKs] {
lappend sorted [lindex $pair 0]
}
在Tcl 8.6中可以做得更优雅:
set sorted [lmap pair [lsort -index 1 [lmap val $yourList {list $val [string range $val end-2 end]}]] {lindex $pair 0}]
为了清晰起见,拆开单线:
# Add in the collation keys
set withCKs [lmap val $yourList {list $val [string range $val end-2 end]}]
# Sort by the collation keys and then strip them from the result list
set sorted [lmap pair [lsort -index 1 $withCKs] {lindex $pair 0}]
另一种方法是在单独的列表中生成排序规则键,然后让lsort
吐出排序时产生的索引。
set CKs [lmap val $yourList {string range $val end-2 end}]
set sorted [lmap idx [lsort -indices $CKs] {lindex $yourList $idx}]
作为一个单行:
set sorted [lmap idx [lsort -indices [lmap val $yourList {string range $val end-2 end}]] {lindex $yourList $idx}]
对于Tcl 8.5(8.4或之前没有-indices
选项):
set CKs [set sorted {}]
foreach val $yourList {
lappend CKs [string range $val end-2 end]
}
foreach idx [lsort -indices $CKs] {
lappend sorted [lindex $yourList $idx]
}
(foreach
/ lappend
模式正是lmap
在8.6中改进的模式。)