Sorting 仅使用最小值对列进行排序

Sorting 仅使用最小值对列进行排序,sorting,tcl,Sorting,Tcl,我有这样的文件: 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

我有这样的文件:

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" 应为浮点数,但得到“” 执行时 “lsort-索引1-实际$records” 第2列不是所有的浮点数,但它是实数; 为什么它不能工作


谢谢

您的关键问题是
拆分
不是提取这些记录的正确方法:它将多空间序列转换为空元素。相反,您希望使用以下选项:

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

这会将该行转换为其非空格序列列表。(是的,重新转换时会丢失空格;这通常不是什么大问题,但如果需要,您可以处理它。)代码的其余部分看起来足够好。

这在很大程度上是关于创建和操作数据结构的问题。我会这样做:

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

您好,这个列表看起来更好:{abak 1 2 3 4}{bb 2 3 4 5}{abak 2 5 6 2}{bb-1.2 3 4 6}{}但问题是相同的:在执行“lsort-index 1-real$records”强大的解决方案时,子列表中缺少元素1,我对dict不太熟悉。dict比数组的一个最大优点是,dict保持键的插入顺序。