Perl:正则表达式-将值与字母匹配

鲁奇克·亚杰尼克

我写了一个小的perl“ hack”,用制表符分隔文件中的一系列列中的字母替换1。该文件如下所示:

Chr Start   End Name    Score   Strand  Donor   Acceptor    Merged_Transcript   Gencode Colon   Heart   Kidney  Liver   Lung    Stomach
chr10   100177483   100177931   .   .   -   1   1   1   1   1   0   1   1   0   0
chr10   100178014   100179801   .   .   -   1   1   1   1   1   1   1   1   1   0
chr10   100179915   100182125   .   .   -   1   1   1   1   1   1   1   0   1   0
chr10   100182270   100183359   .   .   -   1   1   1   1   0   0   1   0   1   0
chr10   100183644   100184069   .   .   -   1   1   1   1   0   0   1   0   1   0

如果在这些列中看到值1,则gola将在第11列至第16列中加上字母A至Z。到目前为止,我的代码正在产生一个空输出,这是我第一次做正则表达式。

cat infile.txt \
| perl -ne '@alphabet=("A".."Z");
            $is_known_intron = 0;
            $is_known_donor = 1;
            $is_known_acceptor = 1;
            chomp;
            $_ =~ s/^\s+//;
            @d = split /\s+/, $_;
            @d_bool=@d[$11-$16];
            $ct=1;
            $known_intron = $d[$10];
            $num_of_overlapping_gene = $d[$9];
            $known_acceptor = $d[$8];
            $known_donor = $d[$7];
            $k="";
            if (($known_intron == $is_known_intron) and ($known_donor == $is_known_donor) and ($known_acceptor == $is_known_acceptor)) {
               for ($i = 0; $i < scalar @d_bool; $i++){
                   $k.=$alphabet[$i] if ($d_bool[$i])
                }
                $alphabet_ct{$k}+=$ct;
            }
            END
            {
               foreach $k (sort keys %alphabet_ct){
                   print join("\t", $k, $alphabet_ct{$k}), "\n";
               }
            } '\
   > Outfile.txt

我应该怎么做呢?

谢谢!

* 编辑 *

预期产量

ABCD 45
BCD 23
ABCDEF 1215

等等等等。

我惊异了外星人

我将您的代码转换为脚本,以便于调试。我在代码中添加了注释以指出狡猾的位:

use strict;
use warnings;

my %alphabet_ct;
my @alphabet = ( "A" .. "Z" );

my $is_known_intron   = 0;
my $is_known_donor    = 1;
my $is_known_acceptor = 1;

while (<DATA>) {
    # don't process the first line
    next unless /chr10/;
    chomp;
    # this should remove whitespace at the beginning of the line but is doing nothing as there is none
    $_ =~ s/^\s+//;

    my @d = split /\s+/, $_;
    # the range operator in perl is .. (not "-")
    my @d_bool         = @d[ 10 .. 15 ];
    my $known_intron   = $d[9];
    my $known_acceptor = $d[7];
    my $known_donor    = $d[6];
    my $k              = "";
    # this expression is false for all the data in the sample you provided as
    # $is_known_intron is set to 0
    if (    ( $known_intron   == $is_known_intron )
        and ( $known_donor    == $is_known_donor )
        and ( $known_acceptor == $is_known_acceptor ) )
    {
        for ( my $i = 0; $i < scalar @d_bool; $i++ ) {
            $k .= $alphabet[$i] if $d_bool[$i];
        }
        # it is more idiomatic to write $alphabet_ct{$k}++;
        # $alphabet_ct{$k} += $ct;
        $alphabet_ct{$k}++;
    }
}
foreach my $k ( sort keys %alphabet_ct ) {
    print join( "\t", $k, $alphabet_ct{$k} ) . "\n";
}

__DATA__
Chr Start   End Name    Score   Strand  Donor   Acceptor    Merged_Transcript   Gencode Colon   Heart   Kidney  Liver   Lung    Stomach
chr10   100177483   100177931   .   .   -   1   1   1   1   1   0   1   1   0   0
chr10   100178014   100179801   .   .   -   1   1   1   1   1   1   1   1   1   0
chr10   100179915   100182125   .   .   -   1   1   1   1   1   1   1   0   1   0
chr10   100182270   100183359   .   .   -   1   1   1   1   0   0   1   0   1   0
chr10   100183644   100184069   .   .   -   1   1   1   1   0   0   1   0   1   0

$is_known_intron设置为1,样本数据给出了结果:

ABCDE   1
ABCE    1
ACD 1
CE  2

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Perl正则表达式匹配元音和辅音

来自分类Dev

如果正则表达式匹配A而不是正则表达式B,则Perl打印

来自分类Dev

使用正则表达式查找匹配项-Perl

来自分类Dev

Perl正则表达式条件匹配

来自分类Dev

Perl正则表达式:与此匹配,但不匹配

来自分类Dev

Perl正则表达式无法匹配行尾

来自分类Dev

打印正则表达式匹配Perl

来自分类Dev

将Perl正则表达式转换为python正则表达式

来自分类Dev

Perl正则表达式以匹配特殊字符

来自分类Dev

Perl正则表达式匹配范围太广

来自分类Dev

正则表达式在Perl中不匹配

来自分类Dev

Perl迭代正则表达式匹配项的数量

来自分类Dev

Perl正则表达式与\ w +不匹配

来自分类Dev

Perl删除与正则表达式匹配的多行

来自分类Dev

单个冒号的Perl正则表达式匹配项

来自分类Dev

Perl与终端中的正则表达式匹配?

来自分类Dev

Perl正则表达式匹配数组

来自分类Dev

Perl正则表达式匹配数字

来自分类Dev

Perl-正则表达式和匹配变量

来自分类Dev

在Perl中使用正则表达式进行匹配

来自分类Dev

在Perl中匹配正则表达式的问题

来自分类Dev

增强Perl正则表达式以实现平衡匹配

来自分类Dev

正则表达式Perl中的特殊行匹配

来自分类Dev

Perl正则表达式条件匹配

来自分类Dev

正则表达式匹配包含单词perl的“单词”

来自分类Dev

打印正则表达式匹配Perl

来自分类Dev

用Perl正则表达式提取匹配项

来自分类Dev

Perl正则表达式部分单词匹配

来自分类Dev

Perl正则表达式匹配范围太广