【发布时间】:2015-07-17 20:50:50
【问题描述】:
我将相当大的文件(“link_lines”)中的行与包含多个列的行进行比较,如下所示:
1245598 1245716 506074 506198 119 119 93.60 0.00 0.01 LG01 scf_1
假设该文件有 100,000 行长,并且都具有相同的设置。最后两列指定基因组位置,我首先必须对每个 LG 和每个 scf 的文件进行迭代,以仅将这两列中包含相同值的行放入一个数组中,以便进一步比较它们。第一个很简单(列出所有 LG 和 scfs 的列表):
temp_links = []
unique_lgs.each do |lg|
unique_scaffold_hits.each do |scf|
link_lines.each do |l|
if l.to_s.split[9] == lg && l.to_s.split[10] == scf
temp_links << l
现在的问题是对第 7 列的“temp_lines”中的所有行进行排序。
我在最后一行使用l.split.to_a 取得了一些进展,但这似乎并没有创建我希望的数组数组(尽管使用起来更容易......)。
非常感谢任何有关如何正确排序这些行的帮助!
编辑
在简单数组上测试了不同的排序方法后,我发现我可能不够简洁。因此,以防万一不清楚我想要什么作为输出,这里有一个更全面的示例。 “temp_links”看起来像这样:
124559 1245716 506074 506198 200 119 93.60 0.00 0.01 LG01 scf_1
985787 9859674 419493 419674 100 300 92.90 0.00 0.02 LG01 scf_1
840174 8401886 677169 677347 300 500 93.89 0.00 0.02 LG01 scf_1
所需的输出将是
840174 8401886 677169 677347 300 500 93.89 0.00 0.02 LG01 scf_1
124559 1245716 506074 506198 200 119 93.60 0.00 0.01 LG01 scf_1
985787 9859674 419493 419674 100 300 92.90 0.00 0.02 LG01 scf_1
所以简单地按行中第 5 列的最大值排序。
为了简单起见,我尝试只输出感兴趣的数字
puts temp_links.split[4] 有效,但 puts temp_links.split[4].sort 返回 “undefined method sort for "100":String (NoMethodError)”
再次感谢任何帮助。
【问题讨论】:
-
也许我误解了一些东西,但是 l.split 应该已经返回一个数组,temp_links
-
如果文件是 100,000 行,您是否考虑过在您的操作系统中使用
sort命令先对文件进行排序,然后使用 Ruby 提取数据?这样会更快,并且会使用最适合特定任务的工具。 -
@jdussault:这就是我最初希望的结果,但是打印出来的结构是
[["a","b","c"]][["a","b","c"]][["a","b","c"]]而不是[["a","b","c"],["a","b","c"],["a","b","c"]],所以不确定那里发生了什么...... -
@theTinMan:当然!
sort -k10, -k11, k5n会带我到那里,我相信awk也会,但这是一个更大的 ruby 脚本的一部分,我希望找到一个使用 ruby 的好方法:)