我有一个这种类型的数组:
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)"
}
但我在结果行中只有一行!
为什么?
答案 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
}
}