У меня есть два списка адресов электронной почты. Один - это файл с разделителями новой строки, состоящий только из адресов электронной почты, содержащих 100 тыс. Строк, а второй файл содержит электронную почту, дату, новую строку ipaddress. Он имеет 4 миллиона строк и содержит дубликаты, которые меня не интересуют.
grep -f fileA.txt fileB.txt работает, когда fileA.txt является тестовым файлом из 100 или 1000 строк, но 100k он никуда не денется.
Я тоже открыт для Perl :)
Когда я сталкиваюсь с подобными вещами, а я не могу / не могу хранить весь один файл в массиве, как предлагает Эрик, я прибегаю к несколько нетрадиционному подходу. Каждый файл экспортируется в отдельную таблицу в базе данных (мне нравится Perl в этой части), а желаемые результаты получаются с помощью SQL-запросов.
Сортировать, а затем различать? Это должно сработать.
Вы можете немного ускорить его, используя -F
вариант, поэтому он ищет фиксированные строки.
grep -Ff fileA.txt fileB.txt
Вы рассчитали свои тесты? О чем вам говорит экстраполяция этого времени на файлы большего размера?
Я предполагаю Linux с этим. Я бы попробовал создать рамдиск и поместив в него оба файла. Это может быть самый быстрый способ попробовать. Поместите это в fstab, а затем выполните mount / mnt для действительно быстрого способа его настройки:
ramdisk /mnt tmpfs mode=1777,size=1G
в perl:
#!/usr/bin/perl -w
my ($emailfile, $file2);
if ( open ( $emailfile, '/path/file') )
{
my @emails = split(/\n/, $emailfile);
if ( open ( $file1, '/path/file') )
{
foreach my $email ( @emails )
{
while ( <$file2> )
{
if ( $_ =~ /$email/)
print $_;
}
}
}
}