Giả sử tất cả các dòng ngắn hơn 7kB và bạn đã cài đặt bash, dd, tail, head, sed và sort từ 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
Thao tác này chia tệp thành từng phần 1024000 byte và thêm 3 * 7 * 1024 byte ("21" trong 1021
) từ đoạn tiếp theo. Vì các bộ phận có thể cắt một dòng, đầu tiên ( 1d
) và cuối cùng ( $d
) dòng của mỗi khối bị phá hủy ( sed
).
Vì vậy, để bù lại, một cái gì đó chứa đoạn cuối cùng được trích xuất lại và chỉ dòng cuối cùng của nó được giữ lại (đuôi -n 1), và dòng đầu tiên cũng được trích xuất lại (đầu -n 1).
Khi vòng lặp thất bại, đoạn cuối cùng đã được trích xuất.
sort -u
có thể được xem như một máy nén, nhưng nó chỉ sắp xếp đầu vào của nó sau đó bỏ qua các bản sao.
"Sắp xếp" đầu tiên nén tất cả các khối. Thư hai sort
nén lại các phần nối của tất cả các khối này (và giây đó sort
đã bị thiếu từ mã trên kể từ lần chỉnh sửa thứ ba, xin lỗi).
Bạn đã nói tập tin văn bản, nhưng dù sao tôi cũng giả sử LANG=
(nhận được tất cả cũng nhanh hơn).