Xóa các dòng dựa trên các bản sao trong một cột mà không sắp xếp


30

Tôi có các tệp 3 cột lớn (~ 10.000 dòng) và tôi muốn xóa các dòng khi nội dung của cột thứ ba của dòng đó xuất hiện trong cột thứ ba của dòng khác. Kích thước của các tệp khiến việc sắp xếp hơi phức tạp và tôi không thể sử dụng mã như mã dưới đây vì toàn bộ các dòng không giống nhau; chỉ nội dung của cột 3.

awk '!seen[$0]++' filename

Câu trả lời:


31

Chỉ cần thay đổi lệnh awk của bạn thành cột bạn muốn thực hiện để xóa các dòng trùng lặp dựa trên (trong trường hợp cột thứ ba của bạn):

awk '!seen[$3]++' filename

Lệnh này cho awkbiết dòng nào sẽ in. Biến $3giữ toàn bộ nội dung của cột 3 và dấu ngoặc vuông là truy cập mảng. Vì vậy, đối với mỗi cột thứ ba của tên tệp, nút của mảng có tên seenđược tăng lên và dòng được in nếu nội dung của nút đó (cột 3) không được !đặt trước đó.

awkLệnh trên sẽ hoạt động nếu các cột của bạn trong tệp đầu vào được phân tách bằng spacehoặc Tabgiữa chúng, nếu các cột được phân cách bằng một cái gì đó khác, bạn cần yêu cầu nó hiển thị với -Ftùy chọn của nó . Vì vậy, ví dụ nếu tất cả các cột được phân cách bằng dấu phẩy ( ,) và muốn xóa các dòng dựa trên -F','tùy chọn sử dụng cột thứ ba .

awk -F',' '!seen[$3]++' filename

18

sortlệnh đã được tối ưu hóa để xử lý các tệp lớn. Vì vậy, bạn rất có thể sử dụng sortlệnh trên tệp của mình như,

sort -u -t' ' -k3,3 file
  • -u - chỉ in các dòng duy nhất.
  • -t- chỉ định dấu phân cách. Ở đây trong ví dụ này, tôi chỉ sử dụng khoảng trắng làm dấu phân cách.
  • -k3,3 - sắp xếp trên trường thứ 3.

Bạn có thể tham khảo này câu trả lời đó cho thấy rằng GNU loại là trong thực tế, tiếp cận tốt hơn để phân loại các tập tin lớn. Trong trường hợp của bạn, tôi nghĩ ngay cả khi không có -parallel, bạn có thể đạt được kết quả cuối cùng của mình mà không bị trì hoãn nhiều thời gian.


Đã định bình luận một cách lén lút rằng -usẽ chỉ xóa các dòng trùng lặp , không phải các khóa trùng lặp ... nhưng tôi đã sai.
Randoms

@Ramesh nó thực hiện công việc nhưng sắp xếp thay đổi chuỗi các dòng mà tôi đoán không mong đợi luôn.
Bharat
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.