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
...

入力用のカテゴリがいくつあるかわかりません。

最後の列でソートされたカテゴリごとに1つのファイルを出力したい

cat1 E F G 10
cat1 A B C 12

最初のファイル

cat2 C F G 4
cat2 H F S 12

2番目のファイルなど....

私はこれを試しました:

すべての行を $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]

しかし、多分それ以上のものがあり、あなたはあなたの例を単純化しました。

いずれにせよ、ファイルごとに1つの結果しか表示されない理由は、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 に答える