免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3354 | 回复: 4
打印 上一主题 下一主题

求助:如何在perl中实现用一个文件里的字符串匹配另一个文件里的字符串? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-04-04 15:47 |只看该作者 |倒序浏览
现在有两个文件,a和b:
a的内容是:
aaa 1
bbb 2
ccc  3
ddd 4
b的内容是:
123 aaa
456 bbb
789 ccc
abc ddd
def eee
我想从a中得到每一行第一个字符串作为第二个文件的匹配关键字,并且打印出b文件中相应的行,不知道该如何做?
就是说: 我先得到a中第一行第一个字符串aaa,然后在b文件中找到123 aaa这一行,匹配上了之后把123 aaa打印到一个文件c,然后再在a文件中取到第二行第一个字符bbb,再和b文件中的456 bbb这一行匹配上了之后把456 bbb打印到文件c,最后c文件的结果是:
123 aaa
456 bbb
789 ccc
abc ddd
我自己写的code是:
#!/usr/bin/perl -w
open(FILE1, "a");
open(FILE2, "b");
open(OUTFILE1, ">c");
while($line1 = <FILE1>)
{
     @array1 = split(/ /, $line1);
     while($line2 = <FILE2>)
     {
             @array2 = split(/ /, $line2);
             if($array1[0] =~ /$array2[1]/)
             {
                      print OUTFILE1 ("@array2");
              }
      }
}

close(FIEL1);
close(FILE2);
close(OUTFILE1);
但是结果就是不对,我怎么想也想不通。
谢谢各位大侠的帮忙了!初学perl,实在是不知道该怎么办

[ 本帖最后由 stobyxu 于 2006-4-4 16:07 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-04-04 19:06 |只看该作者

回复 1楼 stobyxu 的帖子

Tips:

1. using chomp to remove "\n" when read data from file.
2. read file and put it in an array
3. process different array, compare with them and put new records in new array,
    finally write new array into a new file.

P.S.: there is many methods to compare two differnet dada, In your case, using
hash is one of them. For example:
@a = ('aaa 1', 'bbb 2');
@b = ('123 aaa', '456 bbb', '090 foo');
%h_a = map {($k, $v)=split /\s+/; $k=>$v} @a;
%h_b = map {($i, $k)=split /\s+/; $k=>$v} @b;
@c = ();
foreach my $k (keys %h_b) {
    print "$k => $h_b{$k}\n";
    if ( exists $h_a{$k} ) {
        push @c, "$k $h_b{$k}";
    }
}
print join "\n", @c;


Best, ulmer

[ 本帖最后由 ulmer 于 2006-4-4 22:06 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2006-04-05 09:49 |只看该作者
回复二楼: 你的方法在固定数组长度的时候是可以的,但是如果b文件里的每一行都不是固定的长度,那么又该如何处理呢?最后的结果是需要整个b文件中对应行的全部

论坛徽章:
0
4 [报告]
发表于 2006-04-05 13:01 |只看该作者
some modified of your code:
code:
-------------------------
#! /usr/bin/perl -w
open(FILE1, "a");
open(FILE2, "b");
open(OUTFILE1, ">>c");
@a=<FILE1>;
@b=<FILE2>;
foreach (@a)
{
     chomp;
     @array1 = split(/ /, $_);
     foreach (@b)
     {
             if(/$array1[0]/)
             {
                      $c.= $_;
              }
      }
}

print OUTFILE1 $c;

close(FILE1);
close(FILE2);
close(OUTFILE1);
---------------------

BTW, the code of ulmer would be greater and effective.

论坛徽章:
0
5 [报告]
发表于 2006-04-07 18:07 |只看该作者
可以使用grep 函数而不必一行一行的读整个文件:
如:
push(@foo, grep(/bbb/, @b) );
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP