Làm thế nào để xóa một dòng văn bản trùng lặp khỏi tệp lớn hơn 4GB?


6

Tôi đang tìm kiếm một trình soạn thảo văn bản windows (có thể là 64 bit) cho phép tôi loại bỏ các dòng trùng lặp khỏi một tệp văn bản cực lớn (4GB +).

Bạn sử dụng gì để loại bỏ các dòng trùng lặp khỏi các tệp văn bản lớn của bạn?


1
bản sao của .. cái gì? từ ngữ? dòng chữ? cung cấp một mẫu (ngắn hơn đáng kể so với 4gb)
akira

Đã thêm thẻ Windows, vì đây là câu hỏi dành riêng cho Windows.
Sasha Chedygov

Câu trả lời:


4

sort -u file > outfile

Cổng gốc Win32 tiện dụng sortcó trong UnxUtils

Đối với các ý nghĩa phức tạp hơn của "loại bỏ trùng lặp" có Perl (et al).


Cảm ơn bạn đã trả lời, nhưng UnxUtils không có sẵn để tải xuống khi tôi thử.
darkAsPitch


Thật không may, nó không hoạt động đối với các tệp lớn, thật không may, có một lỗi (tôi nghĩ) trong UnxUtils và nó phàn nàn về việc không thể đọc từ / tmp / <temp_file> ...
Gordon Carpenter-Thompson

@Gordon: Thú vị. Làm thế nào lớn là "lớn" trong MB hoặc GBytes? và O / S và hệ thống tập tin, bao nhiêu dung lượng trống?
RedGrittyBrick

HĐH là Windows 2008 R2 Datacenter chạy trên Amazon Web Services. Các tập tin là khoảng 2Gb. Đây chỉ là một ví dụ nhỏ nên có thể đã bị giới hạn RAM / không gian đĩa. Có thể thông báo lỗi là sai lệch. Tôi đã từ bỏ và sắp xếp nó bằng cách sử dụng một cổng cygwin trên cùng một ví dụ.
Gordon Carpenter-Thompson

2

Nếu bạn có Cygwin hoặc MinGW, bạn có thể hoàn thành việc này với

cat file | sort | uniq >> outfile

giả sử bạn muốn dòng duy nhất. Tôi không biết điều này sẽ thực hiện như thế nào, vì việc sắp xếp một tập dữ liệu lớn có thể sẽ mất nhiều thời gian (hoặc nếu nó đã được sắp xếp, bạn có thể bỏ phần đó ra) hoặc chính xác, các lệnh này hoạt động như thế nào (nếu chúng sẽ tiêu tốn 4GB ram hay không).


Cảm ơn bạn! CygWin và lệnh sắp xếp chính xác là những gì tôi cần!
darkAsPitch

1

Bạn có thể xóa các dòng trùng lặp trong một tệp lớn bằng PilotEdit.



0

Tôi cũng đã đăng câu trả lời này lên một câu hỏi trùng lặp về các tệp> 50 GB

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

Điều này phân chia tệp theo từng phần 1024000 byte và cũng 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, dòng đầu tiên (1d) và cuối cùng ($ d) của mỗi thân cây 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 sortnén một lần nữa các phép nối của tất cả các khối này (và thứ hai 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 văn bản, nhưng dù sao tôi cũng giả sử nhị phân, do đó LANG = (cũng nhanh hơn).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.