将分割线添加为数组ruby的数组

时间:2015-07-17 20:50:50

标签: arrays ruby sorting lines

我将相当大的文件(" 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

现在的问题是对&#34; temp_lines&#34;中的所有行进行排序。在第7栏。 我在最后一行使用l.split.to_a取得了一些进展,但这似乎并没有创建我希望的数组数组(虽然更容易使用......)。

非常感谢有关如何正确排序这些线条的任何帮助!

修改

在更简单的数组上测试了不同的排序方法后,我发现我可能不够简洁。所以,如果我不清楚我想要什么作为输出,这里是一个更全面的例子。 &#34; temp_links&#34;看起来像这样:

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)”

同样,非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

以下是如何通过子数组中的特定元素对数组数组进行排序:

lines = [%[3 4], %[1 2]] # => ["3 4", "1 2"]
aoa = lines.map(&:split) # => [["3", "4"], ["1", "2"]]
aoa.sort{ |a, b| a[1] <=> b[1] } # => [["1", "2"], ["3", "4"]]

aoa.sort...将返回已排序数组的实例。

答案 1 :(得分:0)

str = "0.01  LG01 scf_1
0.20  LG02 scf_1
0.02  LG01 scf_1
1.00  LG02 scf_2
1.00  LG02 scf_1"

grouped = str.lines.map(&:chomp).group_by do |line|
  line.split.values_at(-2,-1)
end

puts grouped

# =>
#{["LG01", "scf_1"]=>["0.01  LG01 scf_1", "0.02  LG01 scf_1"],
# ["LG02", "scf_1"]=>["0.20  LG02 scf_1", "1.00  LG02 scf_1"],
# ["LG02", "scf_2"]=>["1.00  LG02 scf_2"]}