ruby - 展平 fasta 文件

标签 ruby bioinformatics

我有一个由我创建的 ruby​​ 脚本创建的 fasta 文件;然而,它有许多重复的序列,它们在不同的序列 ID 下,我想展平文件,这样我就可以从这个 ...

输入fasta文件中的数据(example.fa)

>isotig00009_f3.4.1 
ITLKPCGVPFSCCIPDQASGVANTQCGYGVRSPEQQNTFHTKIYTTGCADMFTMWINRYLYYIAGIAGVIVLVELFGFCFAHSLINDIKRQKARWAHR
>isotig00037_f3.1.1 
KLSLIVVNHSMVASKFERVILAYTSIIIEVSPAKRRRNGKILRKNTIRFRWQTFRILSAFTVVTFSKMMTQKI
>isotig00045_f1.15.3
YKINKRP
>isotig00046_f3.15.3
YKINKRP
>isotig00047_f3.15.3
YKINKRP
>isotig00048_f1.15.3
YKINKRP
>isotig00049_f1.15.3
YKINKRP
>isotig00050_f2.15.3
YKINKRP
>isotig00051_f1.15.3
YKINKRP

对此(在输出文件 - output.fa 中)...

>isotig00009_f3.4.1 
ITLKPCGVPFSCCIPDQASGVANTQCGYGVRSPEQQNTFHTKIYTTGCADMFTMWINRYLYYIAGIAGVIVLVELFGFCFAHSLINDIKRQKARWAHR
>isotig00037_f3.1.1 
KLSLIVVNHSMVASKFERVILAYTSIIIEVSPAKRRRNGKILRKNTIRFRWQTFRILSAFTVVTFSKMMTQKI
>isotig00045_f1.15.3 : isotig00046_f3.15.3 : isotig00047_f3.15.3 : isotig00048_f1.15.3 : isotig00049_f1.15.3 : isotig00050_f2.15.3 : isotig00051_f1.15.3
YKINKRP

我制作了一个小脚本,可以取出序列的一个副本,但尽管尝试了一段时间,但我似乎无法为每个序列添加任何序列 ID。我试过的一件事没有用(见下面的评论部分),就是尝试提取唯一序列,然后提取 sequence_IDs...

这是我正在使用的脚本:

#!/usr/bin/env ruby

filename = "./example.fa"
text = File.read(filename)

def seq_uniq(input, output)
    parser = /^>.*\n(.*)/i
    seq_id_parser = /^(>.*)\n(.*)/i
    file = File.new("#{output}", "w")
    input.scan(parser).uniq.each do |seq|
        file.puts seq
#        input.scan(seq_id_parser) do |seq_id, seq_actual|
#           if seq_actual == seq
#               file.puts seq_id
#           end
#        end
    end
    file.close
end


seq_uniq(text, "./output.fa")

如果有人能指出正确的方向,我将不胜感激。由于这需要嵌入到生成 html 网页的大型 ruby​​ 脚本中,如果您只使用 ruby​​(或

编辑:

澄清一下,我想展平 fasta 文件以将所有 Seq.在一行中标识相同序列的 ID(以 : 分隔),然后在下一行包含该序列。

非常感谢

最佳答案

您可以读取 fasta 文件并创建一个“序列 => 具有相同序列的 id 列表”的散列。请注意,此解决方案假定输入文件每行只有一个 id,如果有多个,则需要改进解析器:

def uniq_sequences(input)
  ids_by_sequence = {}
  input.split(/\n/).each_slice(2) do |id, sequence|
    id = id.gsub(/^>\s*/,'') # Remove the leading ">".
    ids_by_sequence[sequence] = [] unless ids_by_sequence[sequence]
    ids_by_sequence[sequence] << id # Store all ids with the same sequence.
  end
  # Return a string of aggregated ids per same sequence.
  ids_by_sequence.map do |sequence, ids|
    ">#{ids.join(' : ')}\n#{sequence}"
  end.join("\n")
end

puts uniq_sequences(File.read('./example.fa'))

在您的示例输入中,您应该得到以下输出:

>isotig00009_f3.4.1 
ITLKPCGVPFSCCIPDQASGVANTQCGYGVRSPEQQNTFHTKIYTTGCADMFTMWINRYLYYIAGIAGVIVLVELFGFCFAHSLINDIKRQKARWAHR
>isotig00037_f3.1.1 
KLSLIVVNHSMVASKFERVILAYTSIIIEVSPAKRRRNGKILRKNTIRFRWQTFRILSAFTVVTFSKMMTQKI
>isotig00045_f1.15.3 : isotig00046_f3.15.3 : isotig00047_f3.15.3 : isotig00048_f1.15.3 : isotig00049_f1.15.3 : isotig00050_f2.15.3 : isotig00051_f1.15.3
YKINKRP

关于ruby - 展平 fasta 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18450709/

相关文章:

Ruby:WAITING任何子进程完成

ruby-on-rails - 如何使用 POST 请求发送一个数组,该数组的参数名称包含一组空的方括号 []?

Python 用于识别样本中的最小染色体区域

r - 热图.2 : add row/column labels on left/top without hard coding coordinates

ruby - 我怎样才能 splattify 一个匿名对象,以便我可以在它上面使用 &method ?

ruby - 如何安全修复 webrobots-0.0.10.gemspec 的 "invalid date format in specification"

ruby-on-rails - 如何在 RSpec 中重用上下文?

sql - 从(微笑)字符串而不是元素列表中查找字母

r - 如何遮盖绘图子区域并使用ggrepel标记数据点的子集?

awk - 计算传递闭包