LINUX.ORG.RU

помогитн со скриптом - проверка дубликатов строк в файлах


0

0

Задача - есть два файла file1 и file2 с текстовыми строками (в основном разными), но возможны дубликаты строк (в двух файлах одинаковая строка). Вот от одинаковых строк в разных файлах надо избавится и записать результат (без дублей) в третий файл.

Пишу скрипт на перле:

#!/usr/local/bin/perl 

open (IN1, "<file1");
open (OUT, ">file_with_results");

while ($file1 = <IN>) 
{
 chomp($file1);

 open (IN2, "<file2");
 $dubl = 0;                                          
 while ($_ = <IN>)                                        
   {                                                        
     if (/$file1/i){$dubl = 1 ;}
    }                                                        
 close IN2;

 next if ($dubl);
 
 print OUT $file1,"\n";
}

close IN1;
close OUT;

То есть алгоритм туп как пробка - для каждой строки из file1 проверяем ее наличие по всему file2, каждый раз открывая его заново.

Но где то я ошибся, скрипт на выход выдает только первую строку из первого файла и все.

ПОдскажите, как реализовать желаемое?
anonymous

а sort не пробывал?

Не знаю, но может sort именно то, что тебе надо, man sort, или-же sort -u <file.in> > <file.out>

FreeBSD ★★★
()

вот у меня тут мысль появилась : запустить diff и он скажет какие у тебя строки разные,а какие одинаковые...если почитать man,то может и окажется что он может просто выдать номера строк и их использовать... но это просто мысль не подкреплённая знанием работы diff :)

anonymous
()

Попробуй так:
cat file1 file2|sort|uniq > result_file

spirit ★★★★★
()

cat file1 file2 | sort -u > result

Zulu ★★☆☆
()

Ребята, спасибо большое!

Я правда не совсем верно сформулировал условия. поэтому и ответы получил (как спросил, в общем :)

Дело в том, что в file1 могут содержаться не только полные строки из file2, но и части строк, их тоже надо удалить...

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

open (IN, "<file2"); while ($_ = <IN>) { $flag=0;$i=0; while ($file1[$i]) { if ( /$file1[$i++]/i ) {$flag=1)} } if ($flag) next; print $_; }

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.