[英]How to use map and grep in Perl for following data
如何仅显示以分号结尾的链(例如A, C, E, G
) ;
数据
COMPND MOL_ID: 1;
COMPND 2 MOLECULE: JACALIN;
COMPND 3 CHAIN: A, C, E, G;
COMPND 4 SYNONYM: JACKFRUIT
AGGLUTININ;
COMPND 5 MOL_ID: 2;
COMPND 6 MOLECULE: JACALIN;
COMPND 7 CHAIN: B, D, F, H;
COMPND 8 SYNONYM: JACKFRUIT AGGLUTININ
我尝试了以下代码
#!usr/local/bin/perl
open(FILE, "/home/httpd/cgi-bin/r/1JAC.pdb");
while ( $line = <FILE> ) {
if ( $line =~ /^COMPND/ ) {
#$line = substr $line,4,21;
my $line =~ m(/\$:^\w+\$\;/g);
print $line;
}
}
perl -nle'print $1 if /^COMPND\s+\S*\s*CHAIN:(.+);/' /home/httpd/cgi-bin/r/1JAC.pdb
这是将行的一部分“抓”到标准输出的相当简单的方法。 它将捕获括号中的所有内容并将其打印出来。
-n
使用while(<>)
循环从文件中读取数据 -l
处理换行符 您可以使用单个正则表达式,如下所示:
while (my $line = <FILE>) {
if ($line =~ /^COMPND.+?CHAIN:\s*(.*?)\s*;\s*$/) {
my $chain = $1;
print "$chain\n";
}
}
这使用正则表达式来匹配COMPND,CHAIN和结尾;
。 正则表达式末尾的\\s*
将匹配任何尾随空格。 它将捕获CHAIN:
和;
之间的字符串;
不包括设置为$chain
变量值的$1
尾部和前导空格。
有关Perldoc的更多信息:Perlre-Perl正则表达式 。
您可能喜欢这种单线解决方案
perl -le 'print for map /CHAIN:\s*([^;]+)/, <>' /home/httpd/cgi-bin/r/1JAC.pdb
输出
A, C, E, G
B, D, F, H
将GNU grep与perl正则表达式一起使用:在“ CHAIN:”和分号之间找到文本
$ grep -oP '(?<=CHAIN: ).*?(?=;)' filename
A, C, E, G
B, D, F, H
尝试这个
use warnings;
use strict;
open my $nis,"<1jac.pdb";
my @ar = grep{ m/^COMPND/g} <$nis>;
my $s = join("",@ar);
my @dav;
my @mp2 = map{split(/,\s|,/, $_)} grep{ s/(COMPND\s+\d+\s+(CHAIN\:\s+)?)|(\n|;)//g} @dav= $s =~m/(COMPND\s+\d+\s+CHAIN\:.+?(?:.|\n)+?\;)/g;
$, = ", ";
print @mp2;
输出量
A, C, E, G, B, D, F, H
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.