Алгоритм поиска во всем файле 2 каждой строки в файле 1 имеет временную производительность m * n
. где m
- количество строк файла 2, а n
- количество строк файла 1. Это быстро становится очень медленным.
Решение состоит в том, чтобы сначала отсортировать каждый файл (это n*log(n) времени), а затем сравнить строки между двумя файлами следующим образом:
a=(файл 1)[строка i]
с b=(файл 2)[строка j]
. if a then increment i, return to 2 (проверка на конец файла 1).
if a>b;
then increment j, return to 2 (проверка конца файла 2). if a=b;
это совпадение, печатаем его, инкрементируем i. Время выполнения всего: n + m
(время чтения всех строк).
Весь процесс, таким образом, имеет время выполнения: n*log(n) + m*log(m) + n + m
.
Что имеет O(n) от: n * log(n)
для n > m
.
Сортировку легко сделать, просто используйте команду sort
для каждого файла:
sort -t '|' -k 1 file01.csv > file01-sorted.csv
Затем выполните приведенную выше процедуру в awk.
Редактирование: Меня только что осенило, что если все 10k номеров SPLNO уникальны (без повторений). И MDN.TXT также имеет уникальные записи. Тогда конкатенация обоих файлов и поиск повторяющихся значений также даст вам решение. Это работает для простого равенства. Регексные совпадения нарушат эту идею в большинстве случаев.
Я только начал запускать Fedora 28 Live на дешевом новом ноутбуке. Я перешел к dd
своему исходному диску, чтобы, если захочу, запустить свою лицензию Windows 10 Home.
Я отформатировал USB-накопитель емкостью 32 ГБ как exFAT , но он не записывал файл размером более 4 ГБ.
ВРЕМЕННОЕ РЕШЕНИЕ:
Я вытащил внешний HD, отформатированный как exFAT . Мне удалось написать там большой файл. Попробуйте отформатировать накопитель или USB-накопитель как exFAT с помощью Windows. Затем попробуйте написать большой файл с помощью Linux.