有一个这样的文件:
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语言的正则表达式太过强大,适合生物信息学中对文本文件的处理,由于它可以一行一行的遍历,所以不存在卡死的情况,处理文件只是时间问题。
参考文章:
网友评论