计算文件中单词的出现次数,计算任何重复单词的出现次数。 Perl的

时间:2014-04-09 11:48:56

标签: regex perl count hashmap tr

我使用正则表达式逐行读取文件,然后将其拆分为标量变量,如下所示,正则表达式正常。

while (<GTFFILE>) {

        if ($_ =~ /(^\d)\s+\w+\s+(\w+)\s+(\d+)\s+(\d+)\s+\.\s+\W\s+\.\s+(\w+\_\w+\s+\"\w+\"\;)/){

    my $gene = $1;
    my $type = $2;
    my $start = $3;
    my $end = $4;
    my $geneId = $5;

尝试从正则表达式中获取的值生成哈希。

    $featurestart{$start} = $start;
    $featureend{$end} = $end;   

我需要使用正则表达式生成的哈希来查找外显子的长度。这是每行完成的,但我收到错误:在循环变量上缺少$。有什么想法吗?

            for each ($_) { 
            $exonlength = ($featureend{$_} - $featurestart{$_});
            printf ("Exon lengths: = %1.1f\n", $exonlength);
            }

这里我很无能,我想在$ geneId中找到每个单词的出现次数。我会不会匹配未知单词,计算每个未知单词的不同出现次数?我猜是某种功能集群在一起,也许在哈希/数组中,一个单词的重复在一起然后以某种方式计算每个集群?

                    $geneCount{$geneId} = $type; 
                foreach $geneId { 

                }
        }   
    }
}

GTF文件的每一行是: 1个未知的外显子3204563 3207049。 - 。 gene_id“Xkr4”; gene_name“Xkr4”; p_id“P15240”; transcript_id“NM_001011874.1”; tss_id“TSS13146”; 这就是正则表达式正在阅读的内容。外显子在不同行之间变化,它可以是外显子或cds等,每行只有一个或另一个,所以计算外显子单词的出现次数,计算文件中外显子的数量。在'外显子'之后用空格分隔的两个数字是坐标,外显子长度是通过从第一个数减去第二个数来计算的。由';'分隔的短语被分组为geneId。对于这些我想计算整个文件中这一部分的出现次数,类似于外显子,这会发生变化,但是不知道字符串可能是什么,所以想法是找出这个变量中出现了多少个不同的字符串。

1 个答案:

答案 0 :(得分:1)

好的,有几个问题。首先,请允许我将强制性链接放到https://metacpan.org/pod/Bio::Perl,当有人提到基因并解析文件时,我总是痒痒。

当你到达

if ($_ =~ /exon/)

$_仍然是整行。因此,检查当前行是否包含字符串“exon”。所以我假设你想计算那个字符串的出现次数?可悲的是,tr///不会为你做那件事。相反,它将自己替换每个“e”,“x”,“o”或“n”,并计算发生的频率。所以你算上字符,而不是“外显子”。如果您坚持使用这种笨重的方式来计算s/exon/exon/g而非tr///内容应该有效。

编辑: 好的,抱歉,我不得不打断写作。

对于你的错误:你想要循环什么?如果你的意思是

foreach ($_) {

然后这没有多大意义,因为$_只是一个元素。外显子的长度是多少?我根本不知道外显子是什么。 但我认为你的意思是以其他方式填补你的哈希。因为它们具有与值相同的键,因此首先将它们放在一起并不是很有意义。

如果您在计算之后想要任何帮助,您肯定需要提供更多信息,了解您的输入是什么以及您想要做什么。

编辑2编辑问题后:

好的,如果这是您想要做的,您可以执行以下操作:

my $numberOfExon = 0;   # We will increase this whenever we meet an exon.
my @exonLength;         # This array will store all the exon lengths          
my %geneCount;          # This hash will store the counts per geneId

while (<GTFFILE>) {

    if ($_ =~ /(^\d)\s+\w+\s+(\w+)\s+(\d+)\s+(\d+)\s+\.\s+\W\s+\.\s+(\w+\_\w+\s+\"\w+\"\;)/){

        my $gene = $1;
        my $type = $2;
        my $start = $3;
        my $end = $4;
        my $geneId = $5;

        if ($_ =~ /exon/){

            $numberOfExon++;              # just count the lines that have exon in them
            my $length = $end - $start;   # just calculate the length

            push @exonLength, $length;    # Do with the length whatever you want

            $geneCount{$geneId}++;        # Increase the number of times this Id was seen
                                          # If this was the first time, a new field is created
        }
    }
}

print "Number of Exon: $numberOfExon \n";
print "Count of Ids:\n";
use Data::Dumper;
print Dumper(\%geneCount);

这只计算外显子的ID,而不是其他的那些。如果您想要其他人,只需将geneCount{geneId}++放在第一个}之后(如果是外显部分)。