Chinaunix

标题: 如何将两个文本文件中相同行删除 [打印本页]

作者: stray_eagle    时间: 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


请各位大虾帮忙。
作者: kiwivip    时间: 2013-06-09 09:15
cat a.txt b.txt |sort|uniq -u > c.txt
作者: stray_eagle    时间: 2013-06-09 10:02
cat  a 和b,这个是合并了
作者: lhohoz    时间: 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
作者: b114213903    时间: 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;
复制代码

作者: mcshell    时间: 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:}

   
作者: stray_eagle    时间: 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
作者: stray_eagle    时间: 2013-06-09 11:18
如果得到不相同的,
print "$_\n" for grep { $m{$_} == 1 } keys %m;
作者: skles    时间: 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


作者: rubyish    时间: 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>;
复制代码





欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2