首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扁平fasta文件

扁平fasta文件
EN

Stack Overflow用户
提问于 2013-08-26 18:35:56
回答 1查看 421关注 0票数 2

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

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

代码语言:javascript
复制
>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中).

代码语言:javascript
复制
>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.

下面是我使用的脚本:

代码语言:javascript
复制
#!/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(由:分隔),然后在下一行中使用该序列。

非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-26 23:30:41

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

代码语言:javascript
复制
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'))

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

代码语言:javascript
复制
>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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18450709

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档