предполагая, что все строки короче 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
).
таким образом, чтобы компенсировать, что-то, содержащее последний кусок, извлекается снова и только последний строка сохраняется (хвост-n 1), и первая строка также извлекается снова (голова-n 1).
при сбое цикла был извлечен последний кусок.
sort -u
можно рассматривать как компрессор, но он только сортирует его вход, а затем пропускает дубликаты.
Первая "сортировка" сжимает все куски. Второй sort
сжимает снова конкатенации всех этих кусков (и что второй sort
отсутствовал сверху код с третьего редактирования, извините).
Вы сказали, что текст файл, но я все равно предполагаю двоичный, отсюда и LANG=
(становится все быстрее).