免费注册 查看新帖 |

Chinaunix

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

如何将两个文本文件中相同行删除 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-06-08 22:16 |只看该作者 |倒序浏览
初学perl,在实际运用中遇见一个问题,使用了hash,却没能解决掉,概述如下,请各位大虾帮忙解决下,3Q!


示例文件内容如下:

a.txt
parameter1,value1
parameter2,value2
parameter3,value3
parameter3,value9
parameter4,value4
parameter5,value5
parameter5,value6


b.txt

parameter2
parameter5


想将凡是在b.txt文件中的内容,在a.txt中删除(删除a.txt的整行),得到c.txt文件,内容如下:

parameter1,value1
parameter3,value3
parameter3,value9
parameter4,value4


请各位大虾帮忙。

论坛徽章:
0
2 [报告]
发表于 2013-06-09 09:15 |只看该作者
cat a.txt b.txt |sort|uniq -u > c.txt

论坛徽章:
0
3 [报告]
发表于 2013-06-09 10:02 |只看该作者
cat  a 和b,这个是合并了

论坛徽章:
0
4 [报告]
发表于 2013-06-09 10:06 |只看该作者
  1. #!/usr/bin/perl
  2. use warnings;

  3. my %hash;

  4. open(ONE, "1.txt") || die "can't open : $!";
  5. while ($line = <ONE>) {
  6.     ($key, $value) = split /,/ , $line;
  7.     push ( @{$hash{$key}}, $value );
  8. }
  9. open(TWO, "2.txt") || die "can't open : $!";
  10. while (<TWO>) {
  11.     chomp;
  12.     push (@new, $_) if exists $hash{$_};
  13. }
  14. delete $hash{$_} for @new;
  15. foreach $key (sort keys %hash) {
  16.     foreach $para (sort @{$hash{$key}}) {
  17.         print "$key, $para";
  18.     }
  19. }
复制代码
perl 文件名.pl>c.txt

论坛徽章:
7
巳蛇
日期:2013-11-28 09:22:59天秤座
日期:2014-10-25 15:40:452015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:53:172015亚冠之德黑兰石油
日期:2015-07-15 08:46:452015亚冠之平阳省
日期:2015-11-08 16:27:53白银圣斗士
日期:2015-11-14 09:58:12
5 [报告]
发表于 2013-06-09 10:23 |只看该作者
回复 1# stray_eagle
  1. #!/usr/bin/perl
  2. use strict;

  3. my %hash;
  4. open (B,"<b.txt") or die "Open b.txt error:\t$!\n";
  5. while (<B>){
  6.         chomp;
  7.         if($_){
  8.                 $hash{$_}=1;
  9.         }
  10. }
  11. close B;

  12. open (A,"<a.txt") or die "Open a.txt error:\t$!\n";
  13. open (C,">c.txt") or die "Open c.txt error:\t$!\m";
  14. while (<A>){
  15.         chomp;
  16.         my ($key,$value)=split (/\W/,$_);
  17.         if($hash{$key}){
  18.                 next
  19.         }else{
  20.                 print C "$_\n";
  21.         }
  22. }
  23. close C;
  24. close A;
复制代码

论坛徽章:
3
CU十二周年纪念徽章
日期:2013-10-24 15:41:34子鼠
日期:2013-12-14 14:57:19射手座
日期:2014-04-25 21:23:23
6 [报告]
发表于 2013-06-09 10:49 |只看该作者
回复 1# stray_eagle
  1. perl -lne 'chomp;if($ARGV eq "b"){$h{$_}++;next};/([^,]+)(?{print $_ unless $h{$1}})/' b a
复制代码
{:3_186:}

   

论坛徽章:
0
7 [报告]
发表于 2013-06-09 11:11 |只看该作者
感谢大家的帮助,我都好好看下大家的代码。

今早改变了下思路,将b.txt文件增加了第二列记录,要不使用hash老是打印一个完整的a.txt信息,得不到自己想要的,修改如下:
a.txt
key1,1
key3,3
key2,2
key4,4


b.txt
key1,1
key2,2


#!/usr/bin/perl
use strict;
use warnings;
use Data:umper;

my $FILE1=`cat a.txt`;
my $FILE2=`cat b.txt`;

my @array1 = split /\n/, $FILE1;
my @array2 = split /\n/, $FILE2;

my (%m, %n);
foreach ( @array1, @array2 ) {
    $m{$_}++ and $n{$_}++;
}

print "\n相同记录信息如下:\n";
print "$_\n" for grep { $m{$_} >= 2 } keys %m;


运行结果如下:
>perl test.pl

相同记录信息如下:
key1,1
key2,2

论坛徽章:
0
8 [报告]
发表于 2013-06-09 11:18 |只看该作者
如果得到不相同的,
print "$_\n" for grep { $m{$_} == 1 } keys %m;

论坛徽章:
0
9 [报告]
发表于 2013-06-10 10:01 |只看该作者
如果你是linux上运行。何必那么麻烦,针对你这个问题:

# cat a.txt
parameter1.value1
parameter2.value2
parameter3.value3
parameter3.value9
parameter4.value4
parameter5.value5
parameter5.value6
# cat b.txt
parameter2
parameter5
# egrep -vf b.txt a.txt
parameter1.value1
parameter3.value3
parameter3.value9
parameter4.value4

论坛徽章:
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
10 [报告]
发表于 2013-06-10 11:15 |只看该作者
这个 ~
  1. open my $A, 'a.txt';
  2. open my $B, 'b.txt';
  3. open my $C, '>', 'c.txt';
  4. my %h = map { chomp; $_, 1 } <$B>;
  5. @h{/(\w+\d+)/} or print $C $_ while <$A>;
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP