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 回答