2014-11-21 54 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