如何从fasta文件中删除所有N序列条目

时间:2014-04-05 20:56:44

标签: python perl awk

我想删除所有核苷酸为N的fasta文件的条目,但不包含含有ACGT和N核苷酸的条目。

来自输入文件内容的示例:

#>seq_1
TGCTAGCTAGCTGATCGTGTCGATCG
CACCACANNNNNCACGTGTCG
#>seq2
NNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNN
#>seq3
catgcatcgacgatgctgacgatc
#>seq4
cacacaccNNNNttgtgca
#...

希望输出文件内容为:

#>seq_1
TGCTAGCTAGCTGATCGTGTCGATCG
CACCACANNNNNCACGTGTCG
#>seq3
catgcatcgacgatgctgacgatc
#>seq4
cacacaccNNNNttgtgca
#...

使用awk,perl,python,other做任何建议吗? 谢谢! FDS

5 个答案:

答案 0 :(得分:1)

使用GNU awk

awk -v RS='#>seq[[:digit:]]+' '!/^[N\n]+$/{printf "%s",term""$0}; {term=RT}' file
#>seq_1
TGCTAGCTAGCTGATCGTGTCGATCG
CACCACANNNNNCACGTGTCG
#>seq3
catgcatcgacgatgctgacgatc
#>seq4
cacacaccNNNNttgtgca

答案 1 :(得分:0)

所以基本上块以#>开头标记,并且您希望删除没有行包含N以外的任何行的块。在Python中的一种方法:

#! /usr/bin/env python
import fileinput, sys, re

block=[]
nonN=re.compile('[^N\n]')
for line in fileinput.input():
    if line.startswith('#>'):
        if len(block)==1 or any(map(nonN.search, block[1:])):
            sys.stdout.writelines(block)
        block=[line]
    else:
        block.append(line)
if len(block)==1 or any(map(nonN.search, block[1:])):
    sys.stdout.writelines(block)

答案 2 :(得分:0)

在python中使用正则表达式:

#!/usr/bin/env python
import re
ff = open('test', 'r')
data = ff.read()
ff.close()

m = re.compile(r'(#>seq\d+[N\n]+)$', re.M)
f = re.sub(m, '', data)

fo = open('out', 'w')
fo.write(f)
fo.close()

你将进入你的文件:

#>seq_1
TGCTAGCTAGCTGATCGTGTCGATCG
CACCACANNNNNCACGTGTCG

#>seq3
catgcatcgacgatgctgacgatc
#>seq4
cacacaccNNNNttgtgca
#...

希望这会有所帮助。

答案 3 :(得分:0)

使用python,使用BioPython模块:

import Bio

INPUT  = "bio_input.fas"
OUTPUT = "bio_output.fas"

def main():
    records = Bio.SeqIO.parse(INPUT, 'fasta')
    filtered = (rec for rec in records if any(ch != 'N' for ch in rec.seq))
    Bio.SeqIO.write(filtered, OUTPUT, 'fasta')

if __name__=="__main__":
    main()

然而请注意,FastA规范称序列ID应该以{{1​​}}开头,而不是>

反对

#>

这会产生

>seq_1
TGCTAGCTAGCTGATCGTGTCGATCG
CACCACANNNNNCACGTGTCG
>seq2
NNNNNNNNNNNNNNNNNNNNNNNNNN
NNNNNNNNNNNNNN
>seq3
catgcatcgacgatgctgacgatc
>seq4
cacacaccNNNNttgtgca

(注意,默认的线包长度是60个字符。)

答案 4 :(得分:0)

使用shell命令egrep(grep + regrex)

egrep -B 1 "^[^NNNN && ^#seq]" your.fa >conert.fa
# -B 1 means print match row and the previous row
# ^[^NNNN && ^#seq] is regrex pattern means not match with (begin with NNNN and 
# #seq)

因此仅与以公共A / T / G / C序列行及其前一行为fasta标头开头的匹配