我有这样的档案:
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列没有全部浮点数,但它是一个实数; 为什么它不起作用?
由于
答案 0 :(得分: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
答案 1 :(得分:0)
您的关键问题是split
不是提取这些记录的正确方法:它将多空间序列转换为空元素。相反,你想使用它:
lappend records [regexp -all -inline {\S+} $line]
这会将该行转换为非空间序列列表。 (是的,当你重新转换时,你会丢失空格;这通常不是太大的问题,但如果你需要,你可以处理它。)其余代码看起来很好。