2014-11-21 4 views
0

Я многострочные записями в текстовом файле, я хотел бы DeDupe с помощью Perl:DeDup многоканальных записей с 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

Это один из способов сделать это. Вам понадобится '$ seen {$ record} = 1;' в вашем 'if' сообщении. Кроме того, вам может понадобиться выполнить некоторую обработку, например, перемещение ведущего и заднего пробелов. Помните, что вы существенно соответствуете каждому символу записи для символа, поэтому пробел будет влиять на просмотр записи или нет. – chilemagic

+2

Вы никогда не устанавливаете запись в хеш, а проверяете ее существование. Поэтому он всегда возвращает false и печатает запись. – xtreak

+0

Я добавил предложенный код, но он все еще печатает все записи ... и дублирует. – Bubnoff

ответ

0
gawk 'BEGIN {ORS = RS = "#end-of-record\n"} !$seen[$0]++ 
     END { print $ORS }' yourfile 
Смежные вопросы