2012-11-22 39 views
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 " "] 
    } 
} 

但我去的错误:

 
expected floating-point number but got "" 
    while executing 
"lsort -index 1 -real $records" 

列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 
+0

强大的解决方案,我不是很熟悉与字典。 – heyhey

+0

字典的一个重要优点是字典维护键的插入顺序。 –

0

你的关键的问题是,split不提取这些记录的正确方法:它多空间序列转换成空元素。相反,你想要使用这个:

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

这将转换成非空间序列列表的行。 (是的,当你恢复时你会失去空间;这通常不是太大的问题,但是如果你需要的话,你可以处理它。)其余的代码看起来不错。

+0

喜,列表看起来更良好:{abak 1 2 3 4} {BB 2 3 4 5} {abak 2 5 6 2} {bb -1.2 3 4 6} {}但问题是一样的: 元素1从子列表中丢失“” 执行时 “lsort -index 1 -real $ records” – heyhey