for i in *.fasta;
do perl removesmalls.pl 1000 $i > ${i%.fasta}-out.fasta;
done
i think even this will work
## removesmalls.pl
#!/usr/bin/perl
use strict;
use warnings;
my $minlen = shift or die "Error: `minlen` parameter not provided\n";
{
local $/=">";
while(<>) {
chomp;
next unless /\w/;
s/>$//gs;
my @chunk = split /\n/;
my $header = shift @chunk;
my $seqlen = length join "", @chunk;
print ">$_" if($seqlen >= $minlen);
}
local $/="\n";
}
Exexecuting the script as follows:
perl removesmalls.pl 1000 contigs.fasta > contigs-1000.fasta
The above script works for me but there is a problem, i have 109 different fasta files with different file names. i can run the script for individual file but i want to run the script at once for all files and the result file should be individually different for each.
file names are like SRR8224532.fasta, SRR8224533.fasta, SRR8224534.fasta, and so on i want the result files after removing the contigs (i.e., for me less than 1000) something like SRR8224532-out.fasta, SRR8224533-out.fasta, and so on.
Any help or suggestion would be helpfull.
You have two options:
1. Change the script so it can loop on your list of files - shouldn't be too hard.
2. Use some bash tricks to run your script as is on all your files. This is assuming you're on some kind of Unix OS (Linux, MacOS etc.) Then you can do something like this (from your command line):
files=("file1.fasta" "file2.fasta" "file3.fasta")
for f in "${files[@]}"; do echo $f; perl removesmalls.pl 1000 $f > "$f""gt1000"; done
for i in *.fasta;
do perl removesmalls.pl 1000 $i > ${i%.fasta}-out.fasta;
done
i think even this will work
Hello One option is to use reformat.sh from the bbmap package reformat.sh in=contigs.fasta out=filtered.fasta minlength=200
Good luck !
Log in to answer this question.
Write a loop function!