2013-11-29 1 views
0

У меня есть два образца файла для сравнения их содержимого. Мне нужно сравнить эти два файла и вывести любую отсутствующую или дополнительную строку из любого из файлов.Как сравнить два текстовых файла и выводить любые отсутствующие или дополнительные строки из каждого файла?

Ref.txt:

bjkdsl 
dookn 
cmshdksldj 

New.txt:

cmshdksldj 
unklskdjs 
dookn 

выход:

unklskdjs :missing string in Ref.txt  
bjkdsl :missing string in New.txt 

Update: текстовый файл Пример 1

Ref.txt:

bjkdsl 
dookn 
cmshdksldj 

New.txt:

cmshdksldj 
unklskdjs 
dookn 
bjkdsl 

Выход:

unklskdjs : missing string in new.txt 

примеры файлов 2:

Ref.txt:

cmshdksldj 
unklskdjs 
dookn 
bjkdsl 

New.t х:

cmshdksldj 
unklskdjs 
dookn 
bjkdsl 

Выход:

Ref.txt is same as New.txt 

Спасибо за все помогает, но я до сих пор пытаюсь получить коды для каждого условия, которые могут произойти.

ответ

2
use strict; 
use warnings; 

open my $fh, '<', 'text1.txt' or die $!; 
chomp(my @arr1 = <$fh>); 

open my $fh2, '<', 'text2.txt' or die $!; 
chomp(my @arr2 = <$fh2>); 

my (%m1, %m2); 
# populate %m1 hash with keys from @arr1 array using hash slice 
@m1{@arr1} =(); 
# .. 
@m2{@arr2} =(); 

# remove from %m1 hash keys which are found in @arr2, 
# leaving thus only these which are unique to @arr1 array 
delete @m1{@arr2}; 
# .. 
delete @m2{@arr1}; 

# print only keys found in %m2 which by now are only these not found in @arr1 
# this could be just print..for keys %m2; but order of element would be lost 
print "$_ is missing from text 1\n" for grep { exists $m2{$_} } @arr2; 
# .. 
print "$_ is missing from text 2\n" for grep { exists $m1{$_} } @arr1; 

выход

unklskdjs is missing from text 1 
bjkdsl is missing from text 2 
+3

Я настоятельно рекомендую вам прокомментировать это, чтобы объяснить, что он делает; это не будет очевидно для начинающих. –

+0

Спасибо за ваш ответ, но я получаю это 'отсутствует в тексте 1, когда я сравниваю тот же контент с двумя текстовыми файлами. Как я должен избавиться от этого? – annel

+0

@annel Попробуйте изменить –

2

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

#!/usr/bin/env perl 

use warnings; 
use strict; 

my %exclude; 

open my $fh, '<', 'text2.txt' or die $!; 
while (<$fh>) { 
     chomp; 
     $exclude{$_}++; 
} 

open $fh, '<', 'text1.txt' or die $!; 
while (<$fh>) { 
     chomp; 
     if (exists $exclude{ $_ }) { 
       delete $exclude{ $_ }; 
     } 
     else { 
       print "$_ is missing from text2\n"; 
     } 
} 

for (keys %exclude) { 
     print "$_ is missing from text1\n"; 
} 

Выполнить это нравится:

perl script.pl 

Это дает:

bjkdsl is missing from text2 
unklskdjs is missing from text1 
+0

Спасибо за ваш быстрый ответ. Очень ценю это. Это дало выход. Но что, если текст 1 - это bjkdsl dookn cmshdksldj, а текст 2 - cmshdksldj bjkdsl unklskdjs dookn, он по-прежнему выводит строку с отсутствующим текстом, который не должен отображаться. – annel

+1

@annel: Почему бы и нет? Он существует в 'file2', но не в' file1'. – Birei

+0

Но я получаю этот вывод: 'unklskdjs отсутствует в ref отсутствует в ref' – annel

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