Dengan asumsi semua baris lebih pendek dari 7kB, dan bahwa Anda memiliki bash, dd, tail, head, sed, dan sortir yang diinstal dari 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
Ini membagi file dalam potongan 1024000 byte, dan menambahkan juga 3 * 7 * 1024 byte ("21" in 1021
) dari potongan berikutnya. Karena divisi dapat memotong satu baris, baris pertama ( 1d
) dan terakhir ( $d
) dari masing-masing bilah dihancurkan ( sed
).
Jadi sebagai kompensasi, sesuatu yang mengandung potongan terakhir diekstraksi lagi dan hanya baris terakhirnya yang disimpan (ekor -n 1), dan baris pertama juga diekstraksi lagi (kepala -n 1).
Ketika loop gagal, potongan terakhir telah diekstraksi.
sort -u
dapat dilihat sebagai kompresor, tetapi hanya memilah inputnya kemudian melewati duplikat. "Sortir" pertama mengkompres semua potongan. Yang kedua sort
kompres lagi concatenations semua potongan ini (dan yang kedua sort
telah hilang dari kode di atas sejak edit ketiga, maaf).
Anda mengatakan file teks, tapi saya asumsikan biner, karena itu LANG=
(jadi lebih cepat juga).