2012-05-23 6 views
2

Я хочу сравнить два текстовых файла, которые я создал из одного из сценариев perl, которые я написал. Я хочу распечатать согласованные результаты из этих двух текстовых файлов. Я попытался рассмотреть пару ответов и вопросов, которые люди задавали в stackoverflow, но это не работает для меня. Вот что я пробовал.Сравнение двух текстовых файлов в perl и вывода согласованного результата

my $file1 = "Scan1.txt"; 
my $file2 = "Scan2.txt"; 
my $OUTPUT = "final_result.txt"; 
my %results =(); 
open FILE1, "$file1" or die "Could not open $file1 \n"; 
    while(my $matchLine = <FILE1>) 
     { 
     $results{$matchLine} = 1; 
    } 
    close(FILE1); 
    open FILE2, "$file2" or die "Could not open $file2 \n"; 
    while(my $matchLine =<FILE2>) 
     { 
    $results{$matchLine}++; 
     } 
    close(FILE2); 
    open (OUTPUT, ">$OUTPUT") or die "Cannot open $OUTPUT \n"; 
    foreach my $matchLine (keys %results) { 
    print OUTPUT $matchLine if $results{$matchLine} ne 1; 
    } 
    close OUTPUT; 

EXAPLE ВЫХОДА, что я хочу данных

FILE1.TXT данные 2 данные 3

file2.txt data2 data1

OUTPUT данных 1 данных 2

+0

Что «не работает для вас»? Что происходит, что вы не хотите? Кроме того, вы придумали этот алгоритм? Что происходит, когда строка появляется несколько раз в FILE2? – Konerak

+0

В настоящее время, если в файле2 есть дубликаты, он ТОЛЬКО распечатывает дубликаты файла2. Ex file2 имеет data1, data1, data1. Для моего final_result.txt я получаю только данные1. Я хочу иметь только согласованные результаты от file1 и file2. – Maxyie

ответ

1

Ваша проблема заключается в том, что ваш хэш теперь имеет следующие состояния:

  • 0 (строка не найдена где-нибудь),
  • 1 (линия находится в file1 или линии нашли один раз в file2)
  • 2 (строка найдено в file1 и один раз в file2, или линии нашли дважды в file2)
  • п (линии найдено в file1 и N-1 раз в file2, или линии найдено п раз в file2)

Эта неоднозначность сделает ваш чек (hash ne 1) терпит неудачу.

Минимальное требуемое изменение вашего алгоритма будет:

my $file1 = "Scan1.txt"; 
my $file2 = "Scan2.txt"; 
my $OUTPUT = "final_result.txt"; 
my %results =(); 
open FILE1, "$file1" or die "Could not open $file1 \n"; 
    while(my $matchLine = <FILE1>) 
     { 
     $results{$matchLine} = 1; 
    } 
    close(FILE1); 
    open FILE2, "$file2" or die "Could not open $file2 \n"; 
    while(my $matchLine =<FILE2>) 
     { 
    $results{$matchLine} = 2 if $results{$matchLine}; #Only when already found in file1 
     } 
    close(FILE2); 
    open (OUTPUT, ">$OUTPUT") or die "Cannot open $OUTPUT \n"; 
    foreach my $matchLine (keys %results) { 
    print OUTPUT $matchLine if $results{$matchLine} ne 1; 
    } 
    close OUTPUT; 
+0

эй спасибо за ваш ответ, он сработал. – Maxyie

+0

Это не лучшее решение, хотя это всего лишь кратчайший путь к устранению вашей проблемы. – Konerak

Смежные вопросы