2015-06-13 19 views
0

如何仅显示(如A, C, E, G),其用分号;如何使用地图和grep在Perl用于以下数据

数据

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; 
    } 
} 
+0

'AGGLUTININ'是否真的从一条新线开始? – Borodin

+1

'map'和'grep'是强大的工具,但是...如果你不遵循他们正在做的事情,请不要使用它们。他们的案例研究非常多:“每个人都知道调试比编写程序要困难一倍,所以如果你在写代码的时候能够像你一样聪明,那么你将如何调试它?“” - Brian Kernighan – Sobrique

回答

1

您可以使用像下面这样的单个正则表达式:

while (my $line = <FILE>) { 
    if ($line =~ /^COMPND.+?CHAIN:\s*(.*?)\s*;\s*$/) { 
     my $chain = $1; 
     print "$chain\n"; 
    } 
} 

这使用一个正则表达式匹配COMPND,CHAIN和结束;。正则表达式末尾的\s*将匹配任何尾随空格。它将捕获CHAIN:;之间的字符串,不包括$1中的尾随和前导空格,该变量被设置为$chain变量的值。

有关Perldoc: Perlre - Perl regular expressions的更多信息。

+0

该示例已更新以捕获并输出链值,例如“A,C,E,G”。 – Grokify

2
perl -nle'print $1 if /^COMPND\s+\S*\s*CHAIN:(.+);/' /home/httpd/cgi-bin/r/1JAC.pdb 

这是一种非常简单的方法,用于将标准输出的一部分“拼凑”成一行。它将捕获括号中的所有内容并打印出来。

  • -n使用while(<>)循环,从文件中读取数据
  • -l处理换行符
+0

你的脚本不会给出这个pdb文件的结果http://www.rcsb.org/pdb/files/4DX9.pdb – mkHun

+1

@Hussain该文件不遵循与问题中相同的结构。在下一行继续行,并以';'结尾。这不再容易解析,因为你需要多行检查。 – TLP

+0

感谢您的回复。嗯雅我需要一个班轮多线检查。你可以发布吗?? – mkHun

-1

试试这个

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; 

输出

0

你可能会喜欢这一个在线解决方案

perl -le 'print for map /CHAIN:\s*([^;]+)/, <>' /home/httpd/cgi-bin/r/1JAC.pdb 

输出

A, C, E, G 
B, D, F, H 
0

使用GNU的grep用Perl的正则表达式:找到的文本 “产业链:” 分号和

$ grep -oP '(?<=CHAIN:).*?(?=;)' filename 
A, C, E, G 
B, D, F, H