我将相当大的文件(" 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)”
同样,非常感谢任何帮助。
答案 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"]}