This is a test version of Biostars. For the public version, visit https://www.biostars.org.
Remove text flanking .. on fasta-headers

Hi guys,

I have a multi-fasta like this

>Citrobacter_freundii_D8_6645..17576
gtgatcgtcaagaaggttaagaacccgcagaaggcagca
>Enterobacter_hormaechei_35012_3830..23574
atggacgatagagaaagaggcttagcatttttatttgcaatt

And I would like to eliminate the numbers flanking .., to have an output like this

>Citrobacter_freundii_D8
gtgatcgtcaagaaggttaagaacccgcagaaggcagca
>Enterobacter_hormaechei_35012
atggacgatagagaaagaggcttagcatttttatttgcaatt

Since the number are variable, I guess just creating a command to remove x characters from the end of the fasta-header won't be enough. Thanks!

genome sequence

3 answers

If the example is representative, then you basically intend to keep the first three elements that are separated by _. If so, do:

awk ' $1 ~ /^>/ { split($0,a,"_"); print a[1]"_"a[2]"_"a[3];next} {print}'

Command splits every line that starts with > at the _ and then simply prints the first three separated by _ again. Obviously that only works if all fasta headers look like the ones you showed.

$ sed '/>/ s/_[0-9]\+\.\..*$//g' test.fa
>Citrobacter_freundii_D8
gtgatcgtcaagaaggttaagaacccgcagaaggcagca
>Enterobacter_hormaechei_35012
atggacgatagagaaagaggcttagcatttttatttgcaatt

You can accept more than one answer, if they all work. Just so you know.

A bash only solution*, for good measure (because I can't help myself):

$ while read l; do echo "${l%_*}"; done < seqs.fasta

*Assumes there are no other underscores elsewhere beyond the D8 string etc.

Log in to answer this question.