我有一个包含以下内容的大文件:
filename:input.txt
>chr1
jdlfnhl
dh,ndh
dnh.
dhjl
>chr2
dhfl
dhl
dh;l
>chr3
shgl
sgl
>chr2_random
dgld
我需要拆分这个文件,以便我得到四个单独的文件,如下所示:
文件1:chr1.fa
>chr1
jdlfnhl
dh,ndh
dnh.
dhjl
文件2:chr2.fa
>chr2
dhfl
dhl
dh;l
文件3:chr3.fa
>chr3
shgl
sgl
文件4:chr2_random.fa
>chr2_random
dgld
我在linux中尝试了csplit,但是在“>”之后立即无法通过文本重命名它们。
csplit -z input.txt '/>/' '{*}'
答案 0 :(得分:7)
既然你表明你在Linux机器上'awk'似乎是适合这项工作的工具。
<强> USAGE:强>
./foo.awk your_input_file
foo.awk:
#!/usr/bin/awk -f
/^>chr/ {
OUT=substr($0,2) ".fa"
}
OUT {
print >OUT
}
您也可以在一行中执行此操作:
awk '/^>chr/ {OUT=substr($0,2) ".fa"}; OUT {print >OUT}' your_input
答案 1 :(得分:2)
如果你发现自己想要做更复杂的FASTA / FASTQ文件,你应该考虑使用Biopython。
这是关于修改和重写FASTQ文件的帖子:http://news.open-bio.org/news/2009/09/biopython-fast-fastq/
另一个关于拆分FASTA文件:http://lists.open-bio.org/pipermail/biopython/2012-July/008102.html
答案 2 :(得分:1)
稍微凌乱的脚本,但应该在大文件上工作,因为它一次只能读取一行
要运行,请执行python thescript.py input.txt
(或者它将从标准输入读取,如cat input.txt | python thescript.py
)
import sys
import fileinput
in_file = False
for line in fileinput.input():
if line.startswith(">"):
# Close current file
if in_file:
f.close()
# Make new filename
fname = line.rstrip().partition(">")[2]
fname = "%s.fa" % fname
# Open new file
f = open(fname, "w")
in_file = True
# Write current line
f.write(line)
elif in_file:
# Write line to currently open file
f.write(line)
else:
# Something went wrong, no ">chr1" found yet
print >>sys.stderr, "Line %r encountered, but no preceeding > line found"
答案 3 :(得分:1)
您最好的选择是使用exonerate suite中的fastaexplode程序:
$ fastaexplode -h
fastaexplode from exonerate version 2.2.0
Using glib version 2.30.2
Built on Jan 12 2012
Branch: unnamed branch
fastaexplode: Split a fasta file up into individual sequences
Guy St.C. Slater. guy@ebi.ac.uk. 2000-2003.
Synopsis:
--------
fastaexplode <path>
General Options:
---------------
-h --shorthelp [FALSE] <TRUE>
--help [FALSE]
-v --version [FALSE]
Sequence Input Options:
----------------------
-f --fasta [mandatory] <*** not set ***>
-d --directory [.]
--
答案 4 :(得分:0)
with open('data.txt') as f:
lines=f.read()
lines=lines.split('>')
lines=['>'+x for x in lines[1:]]
for x in lines:
file_name=x.split('\n')[0][1:] #use this variable to create the new file
fil=open(file_name+'.fa','w')
fil.write(x)
fil.close()
答案 5 :(得分:0)
如果你特别想用python试试这个,你可以使用这个代码
f2 = open("/dev/null", "r")
f = open("input.txt", "r")
for line in f:
if ">" in line:
f2.close()
f2 = open(line.split(">")[1]),"w")
else:
f2.write(line)
f.close()
答案 6 :(得分:0)
或者,可以使用BioPython。在virtualenv中安装它很容易:
virtualenv biopython_env
source biopython_env/bin/activate
pip install numpy
pip install biopython
一旦完成,拆分fasta文件很容易。假设您有fasta_file
变量中的fasta文件的路径:
from Bio import SeqIO
parser = SeqIO.parse(fasta_file, "fasta")
for entry in parser:
SeqIO.write(entry, "chr{}.fa".format(entry.id), "fasta")
请注意,此版本的格式适用于Python2.7,但它可能无法在旧版本中使用。
至于性能,我用这个来分析1000 Genomes项目的人类基因组参考的时间可以忽略不计,但我不知道它对大文件的作用。
答案 7 :(得分:0)
#!/usr/bin/perl-w
use strict;
use warnings;
my %hash =();
my $key = '';
open F, "input.txt", or die $!;
while(<F>){
chomp;
if($_ =~ /^(>.+)/){
$key = $1;
}else{
push @{$hash{$key}}, $_ ;
}
}
foreach(keys %hash){
my $key1 = $_;
my $key2 ='';
if($key1 =~ /^>(.+)/){
$key2 = $1;
}
open MYOUTPUT, ">","$key2.fa", or die $!;
print MYOUTPUT join("\n",$_,@{$hash{$_}}),"\n";
close MYOUTPUT;
}