Назад | Перейти на главную страницу

Находите совпадения из одного большого файла в другом?

У меня есть два списка адресов электронной почты. Один - это файл с разделителями новой строки, состоящий только из адресов электронной почты, содержащих 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 $_;
      }
    }
  }
}