Я также разместил этот ответ на дубликате вопроса о > 50 ГБ файлов
Предполагается, что все строки короче 7 КБ, и что у вас установлены bash, dd, tail, head, sed и sort из cygwin/unix:
{
i=0
while LANG= dd 2>/dev/null bs=1024 skip=${i}000 if=large_text_file count=1021 \
| LANG= sed -e '1d' -e '$d' | LANG= sort -u ;
do
i=$((1+$i))
done
LANG= dd 2>/dev/null bs=1024 skip=${i}000 if=large_text_file count=1021 \
| LANG= tail -n 1
LANG= head -n 1 large_text_file
} | LANG= sort -u > your_result
Это делит файл на куски по 1024000 байт и добавляет также 3 * 7 * 1024 байт ("21" в 1021) из следующего куска. Поскольку подразделения могут разрезать линию, первая (1d) и последняя ($ d) строки каждого кунка уничтожаются (sed).
Таким образом, чтобы компенсировать, что-то, содержащее последний кусок, извлекается снова, и сохраняется только его последняя строка (tail -n 1), и первая строка также извлекается снова (head -n 1).
Когда цикл терпит неудачу, последний кусок был извлечен.
sort -u может рассматриваться как компрессор, но он только сортирует свои данные и пропускает дубликаты.
Первая "сортировка" сжимает все куски. Второй sort
снова сжимает конкатенации всех этих кусков (и этот второй sort
отсутствует в приведенном выше коде после третьего редактирования, извините).
Вы сказали, текстовый файл, но я все равно предполагаю двоичный файл, следовательно, LANG = (также все быстрее).