从 FASTA 格式的文件中写入单个序列

Writing a single sequence from a file in FASTA format

给定一个FASTA格式的文件(your.file),例如:

>Code1234_length1
ABCEDLKSDJFABCEDLKSDJFABCEDLKSDJFABCEDLKSDJFABCEDLKSDJF
>Code1335_length2
AJDHIEUNAJDHIEUNAJDHIEUNAJDHIEUNAJDHIEUNAJDHIEUN

但是 >Code1234_length1 之后的内容是未知的(在这个例子中它只是为了一个可重现的样本而知道的)。 我想获取 >Code1234_length1 之后的未知内容,包括字符串 >Code1234_length1 但在下一个 > 之前,并将其输出到新文件中。 即

>Code1234_length1
ABCEDLKSDJFABCEDLKSDJFABCEDLKSDJFABCEDLKSDJFABCEDLKSDJF

这是怎么做到的?谢谢。

试试这个:

$ csplit -z test.txt '/^>/' '{*}'

示例:

$ cat test.txt
>Code1234_length1
ABCEDLKSDJFABCEDLKSDJFABCEDLKSDJFABCEDLKSDJFABCEDLKSDJF
>Code1335_length2
AJDHIEUNAJDHIEUNAJDHIEUNAJDHIEUNAJDHIEUNAJDHIEUN

$ csplit -z test.txt '/^>/1' '{*}'
18
74
49

$ ls -1
test.txt
xx00
xx01

$ cat xx00
>Code1234_length1
ABCEDLKSDJFABCEDLKSDJFABCEDLKSDJFABCEDLKSDJFABCEDLKSDJF

$ cat xx01
>Code1335_length2
AJDHIEUNAJDHIEUNAJDHIEUNAJDHIEUNAJDHIEUNAJDHIEUN

如果awk是您的选择,请您尝试:

awk '
    /^>Code1234_length1/ {f = 1; print; next}   # if the keyword is found, set the flag,
                                                #    print the line and continue with the next line
    f {                                         # if the flag is set
        if (/^>/) f = 0                         #    if next ">" is found, reset the flag
        else print                              #    otherwise print the line
    }
' your.file > new.file

即使 >Code1234_length1 行后面有多行,它也能正常工作。

简单的awk:

awk 'BEGIN {RS=">"} [=10=] ~ /Code1335_length2/ { print ">"[=10=] }' file

将记录分隔符设置为“>”,然后搜索所需的代码字符串(不带“>”) 当我们找到匹配项时,打印记录($0)和一个“>”

这些是 FASTA 格式的序列。不要重新发明轮子。特别是,不要编写另一个 FASTA 解析器。相反,使用任何定制的生物信息学 tools/libraries 来处理它们。

例如,将seqtk用作command-line工具(或BioPythonBioPerl等作为相应语言的库):

lh3/seqtk:用于处理 FASTA/Q 格式序列的工具包:https://github.com/lh3/seqtk

Extract sequences with names in file name.lst, one sequence name per line:

seqtk subseq in.fq name.lst > out.fq

要安装 seqtk,您可以像这样使用,例如 conda

conda create -n seqtk seqtk

示例:

cat > your.fasta <<EOF
>Code1234_length1
ABCEDLKSDJFABCEDLKSDJFABCEDLKSDJFABCEDLKSDJFABCEDLKSDJF
>Code1335_length2
AJDHIEUNAJDHIEUNAJDHIEUNAJDHIEUNAJDHIEUNAJDHIEUN
EOF

echo 'Code1234_length1' > name.lst

seqtk subseq your.fasta name.lst > out.fasta

输出:

>Code1234_length1
ABCEDLKSDJFABCEDLKSDJFABCEDLKSDJFABCEDLKSDJFABCEDLKSDJF