如何在tcl中对数组进行排序?

时间:2013-01-08 14:57:56

标签: 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 {{cat1 A B C 12} {cat1 E F G 10} .......

之后,我把它分类:

设置列表[lsort -index 4 -real $ 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)"
    }

但我在结果行中只有一行!

为什么?

1 个答案:

答案 0 :(得分:2)

我不确定regexp是什么意思,因为你可以简单地写一下,

set start [lindex [split $element " "] 0]

但也许还有更多内容,你简化了你的例子。

在任何情况下,您每个文件只看到一个结果的原因是您每次都覆盖table_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
    }
}