0

我正在尝试计算 FASTA 文件中“N”的数量,即:

>Header
AGGTTGGNNNTNNGNNTNGN
>Header2
AGNNNNNNNGNNGNNGNNGN

所以最后我想得到'N'的数量并且每个标题都是一个读取所以我想制作一个直方图所以我最后会输出这样的东西:

# of N's   # of Reads

0            300
1            240

ETC...

所以有 300 个序列或读取有 0 个“N”

use strict;
use warnings;

my $file = shift;
my $output_file = shift;

my $line;
my $sequence;
my $length;
my $char_N_count = 0;
my @array;
my $count = 0;

if (!defined ($output_file)) {
    die "USAGE: Input FASTA file\n";
}
open (IFH, "$file") or die "Cannot open input file$!\n";
open (OFH, ">$output_file") or die "Cannot open output file $!\n";

while($line = <IFH>) {
chomp $line;
next if $line =~ /^>/;
$sequence = $line;
@array = split ('', $sequence);
foreach my $element (@array) {
if ($element eq 'N') {
$char_N_count++;
 }
 }
  print "$char_N_count\n";
 }
4

1 回答 1

2

尝试这个。我改变了一些东西,比如使用标量文件句柄。在 Perl 中有很多方法可以做到这一点,所以有些人会有其他想法。在这种情况下,我使用了一个可能有间隙的数组 - 另一种选择是按计数将结果存储在哈希和键中。

编辑:刚刚意识到我没有使用 $output_file,因为我不知道你想用它做什么:) 如果你的意图是写入它,只需将最后的“打印”更改为“打印 $out_fh”。

use strict;
use warnings;

my $file = shift;
my $output_file = shift;

if (!defined ($output_file)) {
    die "USAGE: $0 <input_file> <output_file>\n";
}
open (my $in_fh, '<', $file) or die "Cannot open input file '$file': $!\n";
open (my $out_fh, '>', $output_file) or die "Cannot open output file '$output_file': $!\n";

my @results = ();
while (my $line = <$in_fh>) {
    next if $line =~ /^>/;
    my $num_n = ($line =~ tr/N//);
    $results[$num_n]++;
}

print "# of N's\t# of Reads\n";

for (my $i = 0; $i < scalar(@results) ; $i++) {
    unless (defined($results[$i])) {
        $results[$i] = 0;
        # another option is to 'next' if you don't want to show the zero totals
    }
    print "$i\t\t$results[$i]\n";
}
close($in_fh);
close($out_fh);
exit;
于 2013-08-20T04:46:25.580 回答