3

私はこの種のファイルを持っています:

abak 1 2 3 4
b.b   2 3 4 5 
abak 2 5 6 2 
b.b  -1.2 3 4 6
cc   3 4 5 6

そして、私はしたいです

abak 1 2 3 4
b.b  -1.2 3 4 6
cc   3 4 5 6  

列の最小値のみを含む、列 2 で並べ替えられたファイル

最初のステップとして、次のように行をソートしようとしました:

set file [open "[lindex $argv 0]" "r"]

    foreach line [split [read $file] "\n"] {
            lappend records [split $line " "]
    }
    set records [lsort -index 1 -real $records]

    foreach record $records {
            puts [join $record " "]
    }
}

しかし、私はエラーに行きます:

浮動小数点数が必要ですが、"" が得られました
    実行中
"lsort -index 1 -real $records"

列 2 はすべて浮動小数点数ではありませんが、実数です。なぜ動作しないのですか?

ありがとう

4

2 に答える 2

1

これは、データ構造の作成と操作に関する非常に重要な問題です。これは私がそれにアプローチする方法です:

set fid [open filename r]
set data [dict create]
while {[gets $fid line] != -1} {
    set fields [regexp -inline -all {\S+} $line]
    dict lappend data [lindex $fields 0] [lrange $fields 1 end]
}
dict for {key values} $data {
    puts [format "%-5s %s" $key [lindex [lsort -real -index 0 $values] 0]]
}

出力

abak  1 2 3 4
b.b   -1.2 3 4 6
cc    3 4 5 6
于 2012-11-22T14:09:58.907 に答える
0

あなたの重要な問題は、splitそれらのレコードを抽出する正しい方法ではないということです.マルチスペースシーケンスを空の要素に変換します. 代わりに、これを使用します。

lappend records [regexp -all -inline {\S+} $line]

これにより、行がスペース以外のシーケンスのリストに変換されます。(はい、再変換するとスペースが失われます。通常、これはそれほど大きな問題ではありませんが、必要に応じて対処できます。) コードの残りの部分は問題なく表示されます。

于 2012-11-22T10:01:20.797 に答える