【问题标题】:Adding split line as array of array ruby添加分割线作为数组 ruby​​ 数组
【发布时间】: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​​ 的好方法:)

标签: arrays ruby sorting lines


【解决方案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... 将返回已排序数组的一个实例。

【讨论】:

  • 谢谢,但我似乎没有从 l.split.map 得到 aoa,所以我一点也不聪明......但我想我要从这些,不应该像这样工作:temp_links_sorted = temp_links.sort_by{|a,b,c,d,e,f,g,h,i,j,k,| e }
【解决方案2】:
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"]}

【讨论】:

  • 感谢您的输入,但我可能太愚蠢了,看看这个分组如何帮助我对所需的行进行排序,并最终再次输出完整的原始行。对不起。
猜你喜欢
  • 1970-01-01
  • 2012-03-29
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 2019-03-03
  • 2016-06-12
  • 1970-01-01
相关资源
最近更新 更多