各位大侠,我现在有一个问题亟待解决:
我有一个文件A,里面是一千多个名字,名字是不规则的,里面会有括号、下划线、空格等各种符号;
另外一个文件B,里面的名字更多,而且会有重复。
我现在需要将B中包含A的名字并且名字后面含有INN的全部提取出来。
例如,A里有一个叫做Captopril,那么B中有好多包含这个名字的,我只要取出下面B文件里面的2到4行(Captopril前面是起始^,后面有空格接一个小括号或中括号,里面一定有INN这个字符的)。
(-)-Captopril Captopril (JP15/USP/INN) Captopril (JP16/USP/INN) Captopril [USAN:INN:BAN:JAN] Captopril [USAN:USP:INN:BAN:JAN] Captoprilum [INN-Latin] L-Captopril D-Captopril Captopril-D7 Captopril-d3
我自己写了一个程序,但是因为B文件有将近10个G,跑起来特别得慢,不过我还是抛砖引玉放出来,希望有大神教教我怎么解决这个问题更有效率,非常感谢! - use warnings;
- use diagnostics;
- use strict;
- my $input1="A.txt"; ###读进文件A
- my %hash;
- my $i;
- my @input1=split("\n",`cat $input1`);
- map{$hash{$_}=1}@input1;
- my $input="B.txt"; ###读进文件B
- open I, $input or die $!;
- open O, ">test.txt" or die $!;
- while(<I>){
- chomp;
- my $alias =$_;
- foreach my $key (%hash){
- if ($alias=~/^\Q$key\E\s\[.*INN.*\]$|^\Q$key\E\s\(.*INN.*\)$/i){ ### 对于文件B的每一行,都循环一次文件A的所有药名,匹配上则输出。
- print O "$alias\n";
- $i++;
- }
- }
- }
- print "$i\n";
- close I;
- close O;
复制代码
|