如何在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
    }
}