1

我有一个包含以下内容的大文件:

文件名: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 '/>/' '{*}'
4

8 回答 8

9

由于您表示您使用的是 Linux 机器,因此“awk”似乎是完成这项工作的正确工具。

用法:
./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
于 2012-08-05T17:38:53.343 回答
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

于 2012-08-05T18:27:25.693 回答
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"
于 2012-08-05T17:38:22.893 回答
1

您最好的选择是使用 exonerate套件中的 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 [.] 

--
于 2012-08-14T02:18:28.220 回答
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()
于 2012-08-05T17:32:16.813 回答
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()
于 2012-08-05T17:36:20.733 回答
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 项目中分离出人类基因组参考,但我不知道它如何处理更大的文件。

于 2013-08-22T18:56:41.417 回答
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;
}
于 2014-01-02T18:23:07.613 回答