免费注册 查看新帖 |

Chinaunix

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

按行比较A,B两文件的内容,遇到困难 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-11 09:43 |只看该作者 |倒序浏览
文件A:
a,b,c
4,6,9,3
张三,AB
文件B:
3,4,6,9
b,c,a
AB,张三
a,b,c,d

要求:按行比较A,B两文件的内容,不考虑每一行中元素的顺序,只考虑包含的元素是否一样。

比较结果是:A文件第1行与B文件第2行是一样的(都含有元素a,b,c,只是顺序不一样),但是与与B文件第4行是一样的(B文件多一个d);
同理,A文件第2行与B文件第1行是一样的;A文件第3行与B文件第3行是一样的;

现实情况是A,B文件均>1000行,每一行元素顺序是乱的且个数从1~40不等。

目前我能比较包含有的情况,但是对于顺序混乱且要求比较它们彼此相等时,一直没有好的思路。用了3个循环一直不出来结果。

求解决思路?

论坛徽章:
0
2 [报告]
发表于 2012-12-11 10:39 |只看该作者
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my %hash;
  5. open A, "A" or die "cannot open A";
  6. while(<A>)
  7. {
  8.     chomp;
  9.     my $t = join(',',sort split/,/);
  10.     $hash{$t} = 1;
  11. }
  12. close A;

  13. open B, "B" or die "cannot open B";
  14. while(<B>)
  15. {
  16.     chomp;
  17.     my $t = join(',',sort split/,/);
  18.     print $t,"\n" if $hash{$t};
  19. }
  20. close B;
复制代码
回复 1# linghu002127


   

论坛徽章:
0
3 [报告]
发表于 2012-12-11 10:50 |只看该作者
本帖最后由 wsxedcer 于 2012-12-11 10:58 编辑

回复 1# linghu002127


    如果同一个文件内没有重复 ,类似 a,b,c 和 c,a,b 的这种,直接 sort 后丢hash里面,然后循环另外一个文件来比较
  1. #!/bin/env perl
  2. open A,"<","a";
  3. while(<A>){
  4.         chomp;
  5.         $i=join("",sort split(/,/));
  6.         $hash{$i}="$_ | $."
  7. };
  8. open B,"<","b";
  9. while(<B>){
  10.         chomp;
  11.         $b=join("",sort split(/,/));
  12.         if($hash{$b}){
  13.                 print "$_  --- $hash{$b}\n"
  14.         }else{
  15.                 print "$_\n"
  16.         }
  17. }
复制代码
改了下可以重复的
  1. #!/bin/env perl
  2. open A,"<","a";
  3. while(<A>){
  4.         chomp;
  5.         $i=join("",sort split(/,/));
  6.         if(defined $hash{$i}){
  7.                 $hash{$i}.="\t$_ | $."
  8.         }else{
  9.                 $hash{$i}="$_ | $."
  10.         }
  11. };
  12. open B,"<","b";
  13. while(<B>){
  14.         chomp;
  15.         $b=join("",sort split(/,/));
  16.         if($hash{$b}){
  17.                 print "$_  --- $hash{$b}\n"
  18.         }else{
  19.                 print "$_\n"
  20.         }
  21. }
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-12-11 10:55 |只看该作者
谢谢!
我思路是一个一个的比较,反复循环。没考虑排序。排完序之后比较会更简单!

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
5 [报告]
发表于 2012-12-11 17:39 |只看该作者
  1. perl  -lne 'chomp;if($ARGV eq "a"){$hash{join(",",sort(split/,/))}=1};if($ARGV eq "b"){print $_ if exists$hash{join(",",sort(split/,/))}}' a b
复制代码

论坛徽章:
0
6 [报告]
发表于 2012-12-11 23:52 |只看该作者
回复 1# linghu002127


   把文件a每一行的第一个看做一个集合A,文件b的每一行看做集合B,看A是否包含B不就ok了吗

论坛徽章:
0
7 [报告]
发表于 2012-12-13 10:52 |只看该作者
两个文件按行 分别读到两个array中,然后用List::Compare模块,即可以选择输出 交集 并集 等 :wink:

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
8 [报告]
发表于 2013-01-21 11:37 |只看该作者
本帖最后由 rubyish 于 2013-01-22 05:04 编辑

文件A:
  1. a,b,e
  2. 4,6,9,3
  3. 张三,AB
  4. q,w,e,r
  5. x,y,z
复制代码
文件B:
  1. 3,4,6,9
  2. b,c,a
  3. AB,张三
  4. a,b,c,d,e
  5. q,w,e
  6. e,a,b
复制代码
  1. #!/usr/bin/perl
  2. use 5.016;
  3. my %b;
  4. my ( $a, $b ) = map { open my ($f), $_; $f } qw/A B/;

  5. while (<$b>) {
  6.     chomp;
  7.     $b{"B:$.-$_"} = { map { $_, 1 } split /,/ };
  8. }

  9. while (<$a>) {
  10.     chomp;
  11.     my @a = split /,/;
  12.     my @s = grep same( \@a, $b{$_} ), keys %b;
  13.     say "A:$.-$_\t ", @s ? "=  " . join( ' & ', @s ) : '与B文件不相等';
  14. }

  15. sub same {
  16.     my ( $x, $y ) = @_;
  17.     my $y2 = keys %$y;
  18.     my $min = @$x > $y2 ? $y2 : @$x;
  19.     $min == grep( { $y->{$_} } @$x ) ? 1 : 0;
  20. }

复制代码
  1. A:1-a,b,e        =  B:6-e,a,b & B:4-a,b,c,d,e
  2. A:2-4,6,9,3      =  B:1-3,4,6,9
  3. A:3-张三,AB      =  B:3-AB,张三
  4. A:4-q,w,e,r      =  B:5-q,w,e
  5. A:5-x,y,z        与B文件不相等
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP