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保持键的插入顺序。