2014-11-21 39 views
0

我在一个文本文件中多行记录,我想用perl到重复数据删除:去重复多行记录,用Perl

记录由“#结束记录”字符串分隔,并期待这样的:

 
CAPTAIN GIBLET'S NEWT CORRAL 
555 RANDOM ST 
TARDIS, CT 99999 

We regret to inform you that we must repossess your pants in part due to your being 6 months late on payments. But mostly it's maliciousness. :) 

TOTAL DUE: $30.00 

#end-of-record 

这是我初步的尝试:

#!/usr/bin/perl -w 

    use strict; 

    { 
      local $/ = "#end-of-record"; 

      my %seen; 
      while (my $record = <>) { 

        if (not exists $seen{$record}) { 
          print $record; 
          $seen{$record} = 1; 
        } 
      } 

    } 

这是打印出每个记录......和重复记录。我哪里做错了?

UPDATE
上面的代码似乎工作。

+2

这是做到这一点的一种方式。不过,您需要在'if'语句中使用'$ seen {$ record} = 1;'。另外,您可能需要执行一些处理,例如移动前导空白和尾随空白。记住,你必须匹配每个字符的记录字符,所以空白将影响记录是否被看到。 – chilemagic 2014-11-21 03:34:06

+2

你永远不会将记录设置到散列,但检查其存在。所以它会一直返回false并打印记录。 – xtreak 2014-11-21 05:53:53

+0

我添加了建议的代码,但它仍然打印所有记录...和重复项。 – Bubnoff 2014-11-21 17:22:42

回答

0
gawk 'BEGIN {ORS = RS = "#end-of-record\n"} !$seen[$0]++ 
     END { print $ORS }' yourfile