免费注册 查看新帖 |

Chinaunix

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

如何得到两个文件中不同的部分 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-06-26 21:55 |只看该作者 |倒序浏览
我有两个文件,A与B,其中的大部分数据时相同的,我想找出两个文件中不同的部分:只有A中有的,只有B中有的。
例如:
A.txt
11-11
22-22
33-33
12-34
44-44

B.txt
11-11
22-22
43-21
56-78
33-33
44-44

得到结果:
A:12-34
B: 43-21
    56-78

结果分别输出到两个文件中也行,单独在一个文件中也可。
请教。

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
2 [报告]
发表于 2012-06-26 22:08 |只看该作者
  1. zhu@ubuntu:~/shell$ diff -y a.txt b.txt
  2. 11-11                                                                11-11
  3. 22-22                                                                22-22
  4.                                                               >        43-21
  5.                                                               >        56-78
  6. 33-33                                                                33-33
  7. 12-34                                                              <
  8. 44-44                                                                44-44
复制代码

论坛徽章:
2
CU大牛徽章
日期:2013-04-17 11:46:28CU大牛徽章
日期:2013-04-17 11:46:39
3 [报告]
发表于 2012-06-27 16:16 |只看该作者
  1. zhu@ubuntu:~/perl$ ./diff.pl a.txt b.txt
  2. a.txt:
  3. 12-34
  4. b.txt:
  5. 43-21
  6. 56-78
  7. zhu@ubuntu:~/perl$ cat diff.pl
  8. #!/usr/bin/env perl

  9. use strict;
  10. use warnings;

  11. sub do_diff {
  12.     my ($fa, $fb) = @_;
  13.     undef $/;
  14.     my $text = $fa . ":\n";
  15.     open my $fh, '<', $fa or die $!;
  16.     $text .= <$fh>;
  17.     close $fh or die $!;
  18.     $text .= $fb . ":\n";
  19.     open $fh, '<', $fb or die $!;
  20.     $text .= <$fh>;
  21.     close $fh or die $!;

  22.     while ($text =~ s/(^.*?$)\n(.*)(\1)\n/$2/mgs) {};

  23.     return $text;
  24. }

  25. my $fa = $ARGV[0] || 'a.txt';
  26. my $fb = $ARGV[1] || 'b.txt';
  27. my $text = do_diff($fa, $fb);
  28. print $text;
  29. zhu@ubuntu:~/perl$ cat a.txt
  30. 11-11
  31. 22-22
  32. 33-33
  33. 12-34
  34. 44-44
  35. zhu@ubuntu:~/perl$ cat b.txt
  36. 11-11
  37. 22-22
  38. 43-21
  39. 56-78
  40. 33-33
  41. 44-44
  42. zhu@ubuntu:~/perl$
复制代码

论坛徽章:
0
4 [报告]
发表于 2012-06-27 17:18 |只看该作者
#!D:\strawberry\perl\bin\perl5.12.3 -w

use strict;
use warnings;

my $filename1="d:/cc/a.txt";
my $filename2="d:/cc/b.txt";

open FILE,$filename1 or die "Can’t open '$filename1': $!";
my @LINE1=<FILE>;
close FILE;

open FILE,$filename2 or die "Can’t open '$filename2': $!";
my @LINE2=<FILE>;
close FILE;

my @LINE3;
my @LINE4;
my $sum1=0;
my $sum2=0;

while(my $a=<@LINE1>)
{
        while(my $b=<@LINE2>)
        {
                if($a eq $b)
                {
      $sum1+=1;
                }
               
        }
        if($sum1 == 0)
        {
                push @LINE3,$a;
        }
        $sum1=0;
}
while(my $a=<@LINE2>)
{
        while(my $b=<@LINE1>)
        {
                if($a eq $b)
                {
      $sum2+=1;
                }
               
        }
        if($sum2 == 0)
        {
                push @LINE4,$a;
        }
                $sum2=0;
}

while(<@LINE3>)
{
        print "A:",$_,"\n";
}
while(<@LINE4>)
{
        print "B:",$_,"\n";
}

论坛徽章:
0
5 [报告]
发表于 2012-06-27 17:47 |只看该作者
还是觉得diff 命令好使

论坛徽章:
0
6 [报告]
发表于 2012-06-28 00:45 |只看该作者
  1. #!perl -w
  2. use strict;
  3. # AUTHOR: niejieqiang
  4. use Text::Diff;

  5. open my $fh, ">", "diff_file.txt";
  6. my $diff = diff "file1.txt", "file2.txt", {
  7.     STYLE  => "Context",
  8.     OUTPUT => \*$fh,
  9. };
  10. close $fh;
复制代码

论坛徽章:
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
7 [报告]
发表于 2012-06-28 01:58 |只看该作者
例如:
  1. #!/usr/bin/perl

  2. my ( $i, $j ) = map { open my ($f), $_; $f } 'A.txt', 'B.txt';
  3. my %a = map { $_, 1 } <$i>;
  4. my %b = map { $_, 1 } <$j>;
  5. print "A:\n", grep { !$b{$_} } keys %a;
  6. print "B:\n", grep { !$a{$_} } keys %b;
复制代码

论坛徽章:
0
8 [报告]
发表于 2012-06-28 03:16 |只看该作者
comm 命令更好

A中有
  1. comm -23 A B
复制代码
B 中有
  1. comm -13 A B
复制代码
A, B 共有
  1. comm -12 A B
复制代码

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
9 [报告]
发表于 2015-12-25 19:55 |只看该作者
本帖最后由 hkldd 于 2015-12-25 19:56 编辑

rubyish大侠;能否把你下面这段代码修改成;把两个文件中的不同部分分别保存在两个文件中。谢谢!
  1. #!/usr/bin/perl

  2. my ( $i, $j ) = map { open my ($f), $_; $f } 'A.txt', 'B.txt';
  3. my %a = map { $_, 1 } <$i>;
  4. my %b = map { $_, 1 } <$j>;
  5. print "A:\n", grep { !$b{$_} } keys %a;
  6. print "B:\n", grep { !$a{$_} } keys %b;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP