perl

perl语言正则表达式模版

2021-05-20  本文已影响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
上一篇 下一篇

猜你喜欢

热点阅读