I have a file with 16S sequences. some headers contain species information. For my purposes I would like to exclude a number of species from the file, therefore I would like to do a pattern matching within a 16S header (that contains other characters beyond the species name) to then remove that header and the following sequence.

So, I have:


I would like to exclude, say, species 1,2 and 4 to retain:


I found this solution in an adjacent question:

awk 'BEGIN{while((getline<"ids.txt")>0)l[">"$1]=1}/^>/{f=!l[$1]}f' seq.fa

where I have my species names in the file ids.txt and sequences in file seq.fa

but that would work if the whole of my header was just the species name (contents of each line in ids.txt), which is not the case. I thought I could be smart and use *species_name1* instead of species_name1 as contents of ids.txt but that apparently doesn't work. Could someone help me with modifying the current solution to accommodate the existence of additinal strings in the headers?

Many thanks! A

  • $\begingroup$ my awk is really bad.. would doing it in R or python help? $\endgroup$
    – StupidWolf
    Apr 28, 2020 at 16:01
  • $\begingroup$ Say yes to that, @SW's Python is really good. The other way in is a Perl one-liner. $\endgroup$
    – M__
    Apr 28, 2020 at 20:32
  • 1
    $\begingroup$ Or, you know, Heng Li's bioawk would be a good middle ground. $\endgroup$
    – Ram RS
    Apr 29, 2020 at 1:58
  • $\begingroup$ @StupidWolf sure thing, I am very new to bioinformatics, so I am happy to operate anything that does the job and learn it in the process : ) R would be preferable at the moment $\endgroup$ Apr 29, 2020 at 11:00
  • $\begingroup$ Hi @Irrussional, see whether the R solution posted below works? I think it should be ok $\endgroup$
    – StupidWolf
    Apr 29, 2020 at 11:05

1 Answer 1


you may use simple R commands, using the 'seqinr' package

#load package
#load file containing sequences
#create a vector containing species names: these are the last part of the string
vec.names<-unlist(lapply(strsplit(names(data), ";"), function(x)x[length(x)]))
#find names to keep: indices which are not in the species to remove
species.to.remove<-c("species_name1", "species_name2", "species_name4")
vec.tokeep<-which(! vec.names %in%  species.to.remove)
#write the final output
write.fasta(sequences=data[vec.tokeep], names=names(data)[vec.tokeep], file.out="output.fa")

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.