如何在tcl中对数组进行排序?
我有一个这种类型的数组:如何在tcl中对数组进行排序?,tcl,sorting,Tcl,Sorting,我有一个这种类型的数组: cat1 A B C 12 cat1 E F G 10 cat2 C F G 4 cat2 H F S 12 cat3 F G M -12 ... 我不知道我有多少种类可供输入 我希望在输出中有一个按类别的文件,按最后一列排序 cat1 E F G 10 cat1 A B C 12 对于第一个文件 cat2 C F G 4 cat2 H F S 12 对于第二个文件,等等 我把这个列为三: 我把每一行都放在一个$list{{cat1abc12}{cat1efg10
cat1 A B C 12
cat1 E F G 10
cat2 C F G 4
cat2 H F S 12
cat3 F G M -12
...
我不知道我有多少种类可供输入
我希望在输出中有一个按类别的文件,按最后一列排序
cat1 E F G 10
cat1 A B C 12
对于第一个文件
cat2 C F G 4
cat2 H F S 12
对于第二个文件,等等
我把这个列为三:
我把每一行都放在一个$list{{cat1abc12}{cat1efg10}….}
之后,我将其排序:
集合列表[lsort-索引4-实际$list]
foreach element $list {
regexp {.*} [lindex [split $element " "] 0] start
set table_cat($start) "$element"
}
之后,我编写文件:
foreach element [array names table_cat] {
set thefile [open "cat_$element.txt" "w"]
puts $thefile "$table_cat($element)"
}
但我在结果行只有一行
为什么?我不确定
regexp
是关于什么的,因为您可以简单地编写
set start [lindex [split $element " "] 0]
但也许还有更多,你简化了你的例子
在任何情况下,每个文件只看到一个结果的原因是每次都覆盖table\u cat($start)
。你可能想做的更像
lappend table_cat($start) "$element"
(顺便说一下,lappend
将创建一个不存在的列表,因此无需“初始化”。)
然后,您希望像这样迭代:
foreach cat [array names table_cat] {
foreach line $table_cat($cat) {
// write $line to the file for $cat
}
}
我不得不说,你的名字有点奇怪。我本想这样写,但每个人都有自己的:
foreach line $lines {
set category [lindex [split $line " "] 0]
lappend lines_by_category($category) $line
}
foreach category [array names lines_by_category] {
set file [open "cat_$category.txt" "w"]
foreach line $lines_by_category($category) {
puts $file $line
}
}