1

我有一个这种类型的数组:

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 ABC 12} {cat1 EFG 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 行!

为什么 ?

4

1 回答 1

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
    }
}
于 2013-01-08T15:11:37.800 回答