У меня есть два файла, huge.txt
и small.txt
. Текст . huge.txt
имеет около 600 миллионов строк и 14 ГБ. В каждой строке есть четыре слова (токены), разделенные пробелами, и, наконец, еще один столбец с цифрами, разделенный пробелами. small.txt
имеет 150K строк размером ~ 3M, разделенное пробелами слово и число.
Оба файла отсортированы с помощью команды сортировки без дополнительных опций. Слова в обоих файлах могут включать апострофы (') и тире (-).
Требуемый вывод будет содержать все столбцы из файла huge.txt
и второй столбец (число) из small.txt
где первое слово huge.txt
и первое слово small.txt
совпадают.
Мои попытки ниже потерпели неудачу со следующей ошибкой:
cat huge.txt|join -o 1.1 1.2 1.3 1.4 2.2 - small.txt > output.txt
join: memory exhausted
Я подозреваю, что порядок сортировки как-то неправильный, хотя файлы предварительно отсортированы с использованием:
sort -k1 huge.unsorted.txt > huge.txt
sort -k1 small.unsorted.txt > small.txt
Проблемы, кажется, появляются вокруг слов, которые имеют апострофы (') или тире (-). Я также пробовал сортировку по словарю, используя опцию -d
в конце которой встречалась та же ошибка.
Я попытался загрузить файлы в MySQL, создать индексы и присоединиться к ним, но, похоже, на моем ноутбуке это заняло несколько недель. (У меня нет компьютера с большим объемом памяти или быстрым диском /SSD для этой задачи)
Я вижу два выхода из этого, но не знаю, как реализовать любой из них.
Как отсортировать файлы так, чтобы команда соединения считала их правильно отсортированными?
Я думал о том, чтобы вычислить MD5 или некоторые другие хеши строк, чтобы избавиться от апострофов и тире, но оставить числа нетронутыми в конце строк. Выполняйте сортировку и объединение хешей вместо самих строк и, наконец, "переводите" хеши в строки. Поскольку хэшей будет всего 150K, это не так уж плохо. Что будет хорошим способом для вычисления отдельных хешей для каждой из строк? Немного волшебства AWK?
Смотрите образцы файлов в конце.
Образец огромный. Текст
had stirred me to 46
had stirred my corruption 57
had stirred old emotions 55
had stirred something in 69
had stirred something within 40
Образец small.txt
caley 114881
calf 2757974
calfed 137861
calfee 71143
calflora 154624
calfskin 148347
calgary 9416465
calgon's 94846
had 987654
Желаемый результат:
had stirred me to 46 987654
had stirred my corruption 57 987654
had stirred old emotions 55 987654
had stirred something in 69 987654
had stirred something within 40 987654