Assumindo que todas as linhas sejam menores que 7kB e que você tenha o bash, o dd, o tail, o head, o sed e o sort instalados a partir do 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
Isso divide o arquivo em partes de 1024000 bytes e adiciona também 3 * 7 * 1024 bytes ("21" em 1021
) do próximo bloco. Como as divisões podem cortar uma linha, primeiro ( 1d
) e última ( $d
) linhas de cada trecho são destruídas ( sed
).
Então, para compensar, algo contendo o último pedaço é extraído novamente e apenas sua última linha é mantida (tail -n 1), e a primeira linha também é extraída novamente (head -n 1).
Quando o loop falha, o último fragmento foi extraído.
sort -u
pode ser visto como um compressor, mas apenas ordena sua entrada e pula duplicatas.
O primeiro "sort" comprime todos os pedaços. O segundo sort
comprime novamente as concatenações de todos esses trechos (e esse segundo sort
está faltando no código acima desde a terceira edição, desculpe).
Você disse que o arquivo de texto, mas eu assumo binário de qualquer maneira, daí o LANG=
(fica tudo mais rápido também).