This is a test version of Biostars. For the public version, visit https://www.biostars.org.
Bioinformatics Perl Help

Hi,

I'm having trouble with this task:

Write a perl script that will generate a new output file (“task1 output.txt”) which contains the sequence name, length, and GC-content for each sequence. There should be a header line which identifies the contents of columns (so the first line in the output file should be “SeqName Length GC-Content” or something similar). The GC-content of a sequence is defined as the percentage of bases that are G or C (from 0% to 100%), and a high GCcontent is associated with coding sequences.

>Seq1
ACGT

Then your output file should look like:

SeqName Length GC-Content
Seq1              4           50

I can do the in and out for the file handles, but I'm confused as to what to put in my while loop. And how will it know to match in the file?

perl

You need to show the code so we can see the issues you are having. We can tell you what to do but that probably won't help much.

use strict;
use warnings;

open(IN,"/home/ki/Downloads/HW3_Sequences.txt") or die "Cant open file: $!";
open(OUT, ">/home/ki/Downloads/HW3final.txt");
while(<IN>) {{if($_ =~ m/>/){
    print OUT "$_"
    }
    {if($_ =~ tr/AGTC/AGTC/){
    print OUT 
}
}
}
}
  1. Why the double {{ for the while body?
  2. What is the purpose of the tr operation?

to count the length of each sequence ?

You're using a tr operation to count length? Why?

what do you suggest ?

The length() function sounds appropriate here.

thanks alot, all for your help i got it.

i thought the double {{ is necessary for multiple tasks within the loop ?

Who says so? That makes no sense in any programming language.

thank you Ill remove it, Im learning as I go here.

1 answer

Like mentioned, GC content is the percentage of bases that are G or C in the sequences. Percentage is calculated quite easily using basic math once you obtain the counts of bases that are G or C in and the total sequence length for each sequence. Your loop with iterate through the file, executing its code block for each sequence it finds.

I cannot - and I hope others do not too - provide code. That would cripple learning.

Perhaps you should try preparing a script to do this task for a file with just 1 sequence.

After you prepare the correct output for this 1 sequence, expand the script to do this task in a loop for more sequences.

open(IN,"/home/ki/Downloads/HW3_Sequences.txt") or die "Cant open file: $!";
open(OUT, ">/home/ki/Downloads/HW3final.txt");
while(<in>){if( =~ m/>/)
    print OUT "$_n/"
    }

I'm confused by the while loop it only does it for one sequence, it won't do the rest in the file

one hint is that "IN" is not the same thing as "in".

open(IN,"/home/ki/Downloads/HW3_Sequences.txt") or die "Cant open file: $!"; open(OUT, ">/home/ki/Downloads/HW3final.txt"); while(<in>){if( =~ m/>/) print OUT "$_n/" }

im getting a syntax error from this

Please stop pasting the same code over and over again. Chris has answered on what the primary problem with that piece of code is.

I corrected it so that its <in>

sure, its just i need guidance with the while loop ive posted my code below

i should tr to count my sequence length ?

open(IN,"/home/ki/Downloads/HW3_Sequences.txt") or die "Cant open file: $!"; open(OUT, ">/home/ki/Downloads/HW3final.txt"); while(<in>){if($_ =~ m/>/){ print OUT "$_" } {if($_ =~ tr/AGCT/AGCT/){ print OUT "$_" } } }

Log in to answer this question.