如何在Perl中使用map和grep来跟踪数据

时间:2015-06-13 09:45:06

标签: perl dictionary grep

如何仅显示以分号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;
    }
}

5 个答案:

答案 0 :(得分:2)

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

这是一种将线路“grepping”到标准输出的相当简单的方法。它将捕获括号中的所有内容并打印出来。

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

答案 1 :(得分: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的更多信息。

答案 2 :(得分:0)

您可能喜欢这种单行解决方案

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

<强>输出

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

答案 3 :(得分:0)

将GNU grep与perl正则表达式一起使用:在&#34; CHAIN:&#34;之间找到文本。和分号

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

答案 4 :(得分:-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;

输出

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