免费注册 查看新帖 |

Chinaunix

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

文件提取多行 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-05-31 15:29 |只看该作者 |倒序浏览
请问,在两个文件中,一个文件时目录,另外一个文件时目录加内容,怎样利用第一个文件的目录把第二个文件中的目录和内容提取出来。
例如,目录文件时
a
c
d
第二个文件时
>a
4545
45667
8990
>b
dfdfdf
79oio
>c
4567
0977
1435
>d
495897
23445
要得到的结果是
>a
4545
45667
8990
>c
4567
0977
1435
>d
495897
23445
每个目录前都有一个>号

论坛徽章:
0
2 [报告]
发表于 2010-05-31 16:31 |只看该作者
一个简单的办法,如果第一个文件数据量不大,那么把每一行去掉回车换行作为key放进hash
第二个文件每一行去掉回车换行后,作为key去索引hash内容,如果不为空则说明存在于第一个文件中

论坛徽章:
0
3 [报告]
发表于 2010-05-31 17:48 |只看该作者
我想要的是得到筛选的文件,就是包含有目录文件中条目对应的信息

论坛徽章:
0
4 [报告]
发表于 2010-05-31 17:56 |只看该作者
二楼说的得,把文件二通过范围匹配后,以目录名为KEY存入HASH,然后访问文件1中的目录。

你可以看一下前面的贴,是同样的问题:
http://bbs3.chinaunix.net/thread-1711808-1-1.html

论坛徽章:
0
5 [报告]
发表于 2010-05-31 19:32 |只看该作者
谢谢!

论坛徽章:
0
6 [报告]
发表于 2010-06-01 11:24 |只看该作者
回复 1# shuigui56


二楼说的得,把文件二通过范围匹配后,以目录名为KEY存入HASH,然后访问文件1中的目录。

你可以看一下前面的贴,是同样的问题:
http://bbs3.chinaunix.net/thread-1711808-1-1.html

按照上面的提示,我写了一个命令,供楼主参考:(wenjian.pl)
#!/usr/bin/perl
use strict;

open(ONE,"$ARGV[0]") or die $!;
open(TWO,"$ARGV[1]") or die $!;

my (%hash, $key);

while(<ONE>) {
                  
         if (/^>/) {
         $key=$_;
         
}              
         $hash{$key}.=$_;
         
         
}     

while (<TWO>) {
   
   
    print $hash{">".$_} if exists ($hash{">".$_});
}

one为1.txt
>a
4545
45667
8990
>b
dfdfdf
79oio
>c
4567
0977
1435
>d
495897
23445

two为2.txt
a
b
c
运行:
[liuguiyou@localhost perl_example]$ ./wenjian.pl  2.txt  1.txt
[liuguiyou@localhost perl_example]$ ./wenjian.pl  2.txt  1.txt
>a
4545
45667
8990
>b
dfdfdf
79oio
>c
4567
0977
1435

论坛徽章:
0
7 [报告]
发表于 2010-06-01 22:55 |只看该作者
回复 1# shuigui56
  1. !/usr/bin/perl -w
  2. #目录文件1,文件2包含目录和该目录下的文件名,提取目录名在1的那些行
  3. use strict;
  4. use 5.010;
  5. open FILE_1,"<data_012" or die "Cannot open dir data_012";
  6. open FILE_2,"<data_011" or die "Cannot open dir data_011";
  7. my %hash;
  8. $/=">";
  9. <FILE_2>;
  10. while (<FILE_2>) {
  11.     chomp;
  12.     my ($key,$value) = $_=~ /([^\n]+)\n([\d \D]+)/;
  13.     $hash{$key} = $value;
  14. }
  15. $/="\n";
  16. chomp (my @key = <FILE_1>);
  17. foreach my $key_1 (@key) {
  18.     printf ">$key_1\n$hash{$key_1}";
  19. }
复制代码

论坛徽章:
0
8 [报告]
发表于 2010-06-01 23:40 |只看该作者
本帖最后由 黑色阳光_cu 于 2010-06-01 23:49 编辑

  1. #!/bin/env perl

  2. use strict;
  3. use warnings;

  4. open(DIR, "<", "dirs.txt") or die $!;
  5. open(CONTENT, "<", "contents.txt") or die $!;
  6. my $content = join("", <CONTENT>);
  7. foreach my $dir (map {chomp; $_} <DIR>)
  8. {
  9.         print ">$dir\n$1" if ($content =~ /(?<=^>\Q$dir\E\n)(.*?)(?=^>|$(?!\n))/sm);
  10. }
复制代码

论坛徽章:
78
双子座
日期:2013-10-15 08:50:09天秤座
日期:2013-10-16 18:02:08白羊座
日期:2013-10-18 13:35:33天蝎座
日期:2013-10-18 13:37:06狮子座
日期:2013-10-18 13:40:31双子座
日期:2013-10-22 13:58:42戌狗
日期:2013-10-22 18:50:04CU十二周年纪念徽章
日期:2013-10-24 15:41:34巨蟹座
日期:2013-10-24 17:14:56处女座
日期:2013-10-24 17:15:30双子座
日期:2013-10-25 13:49:39午马
日期:2013-10-28 15:02:15
9 [报告]
发表于 2010-06-02 18:37 |只看该作者
回复 8# 黑色阳光_cu


    ($content =~ /(?<=^>\Q$dir\E\n)(.*?)(?=^>|$(?!\n))/sm)学习了

论坛徽章:
0
10 [报告]
发表于 2010-06-04 15:54 |只看该作者
相对来说,内容文件会比目录文件大很多,楼上各位把内容文件所有内容都存贮起来是否浪费?
存储目录,遍历内容时再判断对应目录是否在目录文件中:

#!/usr/bin/perl -w

use strict;

open FILE_DIR,"dir.txt" or die "Cannot open dir.txt file";

open FILE_CONTENT,"content.txt" or die "Cannot open content.txt file";

my %hash;

while(<FILE_DIR>)
{
        chomp;
        next unless($_);
        $hash{$_}=1;
}
my $findFlag=0;
while (<FILE_CONTENT>) {               
    chomp;
    $findFlag = $hash{$1} if(/^>(\w+)/);
    print $_,"\n" if($findFlag);
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP