我有一个由我创建的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
我制作了一个小脚本,它取出了一个序列的副本,但尽管尝试了很长一段时间,我似乎无法为每个序列添加任何seq 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(以:)分隔,然后在下一行上显示序列。
非常感谢
答案 0 :(得分:1)
您可以阅读fasta文件并创建“sequence =>具有相同序列的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