免费注册 查看新帖 |

Chinaunix

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

求助:文本比较处理 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-04-08 15:56 |只看该作者 |倒序浏览
目标:将文本A和文本B进行比较。
A的内容如下:
11|
22|
33|
44|
B的内容如下:
11|aaa|
22|bbb|
33|ccc|

比较后能分为4个文件:
文件aaa:  11|aaa|

文件bbb:  22|bbb|

文件ccc:  33|ccc|

文件error:  44|
(因为A文本的“44|”数据在B文本中不存在)

本人才开始学习perl,麻烦能给个模版,谢谢!

论坛徽章:
0
2 [报告]
发表于 2010-04-08 16:14 |只看该作者
有米人帮忙看看的?

论坛徽章:
0
3 [报告]
发表于 2010-04-08 16:22 |只看该作者
用hash

论坛徽章:
0
4 [报告]
发表于 2010-04-08 16:50 |只看该作者
我知道这个思路,就是没测出来,头痛ing

论坛徽章:
0
5 [报告]
发表于 2010-04-08 17:13 |只看该作者
有好心人给整理个模版不?感谢

论坛徽章:
0
6 [报告]
发表于 2010-04-08 17:19 |只看该作者
也是几句的事情··

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
7 [报告]
发表于 2010-04-08 17:50 |只看该作者

  1. #!/usr/bin/env perl
  2. #

  3. use strict;
  4. use warnings;

  5. @ARGV = qw(A B);

  6. my $nextf = 0;
  7. my %hash = ();

  8. while (<>) {
  9.     if ($nextf == 1) {
  10.         my @t = split /\|/;

  11.         if (defined $hash{$t[0]}) {
  12.             `echo -n "$_" > $t[1]`;
  13.             $hash{$t[0]} = 1; # delete entry if no duplicate key in file B
  14.         }
  15.     } else {
  16.         chomp;
  17.         $hash{(split /\|/)[0]} = 0;
  18.     }
  19. } continue {
  20.     $nextf = 1 if eof;
  21. }

  22. #`rm -f error`;
  23. foreach (keys(%hash)) {
  24.     `echo -n "$_|\n" >> error` if ($hash{$_} <= 0);
  25. }

  26. __END__
  27. A:
  28. 11|
  29. 22|
  30. 33|
  31. 44|
  32. B:
  33. 11|aaa|
  34. 22|bbb|
  35. 33|ccc|
复制代码

论坛徽章:
3
戌狗
日期:2014-09-10 17:07:162015年辞旧岁徽章
日期:2015-03-03 16:54:15wusuopu
日期:2016-06-17 17:43:45
8 [报告]
发表于 2010-04-08 17:52 |只看该作者
回复 7# ynchnluiti


    不一定适用于其它不同内容、不同格式的文件

论坛徽章:
3
CU大牛徽章
日期:2013-03-13 15:29:07CU大牛徽章
日期:2013-03-13 15:29:49CU大牛徽章
日期:2013-03-13 15:30:19
9 [报告]
发表于 2010-04-08 18:27 |只看该作者
本帖最后由 MYSQLER 于 2010-04-08 18:34 编辑
  1. #!/usr/bin/perl -w
  2. use strict;

  3. open (B, "<", "b.txt") or die "Can't open a.txt: $!";

  4. while (<B>) {
  5.         chomp;
  6.         my @b1 = split /\|/ ;
  7.         open (A, "<", "a.txt") or die "Can't open b.txt: $!";
  8.         while (<A>) {
  9.                 chomp;
  10.                 my @a1= split /\|/;
  11.                 if ($a1[0] eq $b1[0]) {
  12.                         my $file = $b1[1];
  13.                         open (STDOUT, ">", "$file") or die "Can't open test.txt: $!";
  14.                         print $b1[0] . "|" . $b1[1] . "|" .  "\n";

  15.                 }
  16.                 else {
  17.                         open (STDOUT, ">", "error.txt") or die "Can't open error.txt: $!";
  18.                         print $a1[0] . "|" . "\n";
  19. }
  20.         }
  21.         close(A);
  22. }
  23. close(B);
复制代码

论坛徽章:
0
10 [报告]
发表于 2010-04-09 15:02 |只看该作者
谢谢各位了,特别感谢7搂、9搂的哥们
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP