美文网首页perl
perl语言正则表达式模版

perl语言正则表达式模版

作者: 食品猪的生信鸡 | 来源:发表于2021-05-20 16:53 被阅读0次

    有一个这样的文件:

    oas00001.json

    我想把它乱七八糟的符号去掉,变成这样:

    1.txt

    用perl语言如何实现呢?

    open(FH, "<oas00001.json") or die "file cannot open, $!"; #打开文件,读取到句柄FH
    while(<FH>){ #遍历句柄FH的每一行
        if($_!~/name/){ #如果该行不能匹配name字符串
            next; #那么跳过改行,直接读取下一行
        }
        print $_; #将每一行的内容打印出来
    }
    close FH #关闭句柄
    

    那么如何将结果写入新文件呢?

    很简单在linux的shell或者windows的cmd输入:

    perl filt.pl > 1.txt         #filt.pl为上述perl代码存放文件
    

    另外,附一些perl语言强大的正则表达式:

    =~// #perl语言匹配符号,//之间为匹配的内容
    =~/GAATTC/ #匹配GAATTC字符串
    !~/GAATTC/ #不匹配GAATTC字符串
    =~/GAAT+C/ #匹配一个或者多个T
    =~/GAA[TU]C/ #匹配TT或者UU
    =~/GAAT.C/ # .代表一个任意字符
    =~/GAAT{1,3}C/ #匹配1到3个T
    =~/^C(\W+)A$/ #匹配以C开头,以A结尾,中间任意单词不含空格字符串
    \s 空格
    \t 一个tab键
    \n 换行符
    

    好吧,我不装了,其实,我是想把文件变成这样:

    为了将通路和基因富集到一起

    上面的代码可以改成这样:

    open(FH, "<oas00001.json") or die "file cannot open, $!";
    while(<FH>){
        if($_!~/PATH/ and $_!~/EC/){ #对于既不能匹配到PATH又不能匹配到EC的行跳过。
            next;
        }else{ #代码写成if...else...的形式也更加通俗易懂了
            print $_;
        }
        
    }
    close FH
    

    好的,我的意图又增加了,我想得到这样的结果:

    只保留数字

    那我可以继续这样做:

    use utf8;
    binmode(STDOUT,":utf8");
    open(FH, "<1.txt") or die "file cannot open, $!";
    while(<FH>){
        if($_=~/"name":"\w+/){ #匹配以"name":"开头,后续包含字母或者数字长短不限的单词,只能读到空格
            print "$&\n"; #把匹配到的内容$&打印出来,记得加换行符\n
        }
        
    }
    close FH
    

    事情还没完,我还想这样,把通路名字和代码保留,只保留Gene ID,像这样:

    新需求

    很简单:

    use utf8;
    binmode(STDOUT,":utf8");
    open(FH, "<1.txt") or die "file cannot open, $!";
    while(<FH>){
        if($_=~/"name":"\w+/){
            if($_=~/PATH/){ #再次进行条件选择,如何一行同时匹配到PATH
                print "$_"; #打印整个一样
            }else{
                print "$&\n"; #否者仅打印匹配到的字符串
            }
        }
    }
    close FH
    

    这回真的真的是最后一步了,实际上进行GESM分析的关键是构建成这样的数据类型:

    Last

    怎么办?

    看终极代码

    use utf8;
    binmode(STDOUT,":utf8");
    open(FH, "<1.txt") or die "file cannot open, $!";
    while(<FH>){
        if($_=~/PATH/){ #如果该行匹配到PATH
                chomp($a = $_);  #chomp函数是将字符串后面的\n去掉,这里$a比$_少了一个换行符
                print "\n"; #在该行前先加一个换行符(注意:这里是关键)
                print "$a"; 
            }else{
                chomp($b = $_); #如果该行不匹配
                print "\t"; #在在该行前先加一个tab
                print "$b"; #
            }
    }
    close FH
    

    感悟:

    利用perl语言或者其他编程语言解决实际问题,其实最重要的是一个思路,不同的语言只是工具,只不过perl语言的正则表达式太过强大,适合生物信息学中对文本文件的处理,由于它可以一行一行的遍历,所以不存在卡死的情况,处理文件只是时间问题。

    参考文章:

    1. https://www.bilibili.com/video/BV1KJ411n7Mn?p=4
    2. 菜鸟教程https://www.runoob.com/perl/perl-files.html
    3. https://www.cnblogs.com/dancheblog/p/3528000.html

    相关文章

      网友评论

        本文标题:perl语言正则表达式模版

        本文链接:https://www.haomeiwen.com/subject/apkbjltx.html