This is a test version of Biostars. For the public version, visit https://www.biostars.org.
Split multi-fasta file and keep structure

Hey everyone,

I have a multi-fasta file, and when I want to split into individual fasta files, I use a command like this

    cat myfile | awk '{
        if (substr($0, 1, 1)==">") {filename=(substr($0,2) ".fna")}
        print $0 > filename
}'

However, each individual fasta file represents a contig, and each contig belong to a given bacterial genome. So, if I have a multi-fasta like this

>PS_A_1
>PS_A_2
>PS_B_1
>PS_B_2

Using the above command will generate 4 individual fasta files. My objective is to split all files, so that PS_A_1 and PS_A_2 are concatenated in the same file (PS_A.fasta). The same for PS_B and so on.

Thanks a lot!

sequence

1 answer

$ seqkit -w 0 split -i --id-regexp '(.*)_[0-9]+' test.fa
$ awk -F '[>_]' '/>/{getline seq; print $0"\n"seq>$2"_"$3".fa"}' test.fa

Please make sure that fasta is flattened if you are using awk function above. If sequences are multi line, use seqkit.

If you want the output to be in a single file (concat) instead of multiple files of the same name, try this:

$ awk -F '[>_]' -v OFS="\t" '/>/{getline seq; print $2"_"$3,seq}' test.fa | datamash -s -g1 collapse 2 | awk '{gsub(/,/,""); print ">"$1"\n"$2 > $1".fa"}'
$ seqkit replace -ip '_[0-9]+$'  -r "" test.fa  | seqkit fx2tab | datamash -sg 1 collapse 2 | sed 's/,//g' | seqkit tab2fx | seqkit split -i -O out

This would need datamash, available in most of the GNU-linux repos.

Log in to answer this question.