Tôi sử dụng rất nhiều grep awk sort trong shell unix của mình để làm việc với các tệp văn bản cột được phân tách bằng thẻ cỡ trung bình (khoảng 10M-100M). Về mặt này, vỏ unix là bảng tính của tôi.
Nhưng tôi có một vấn đề lớn, đó là chọn các bản ghi được cung cấp danh sách ID.
Có table.csv
tệp có định dạng id\tfoo\tbar...
và ids.csv
tệp có danh sách id, chỉ chọn các bản ghi từ table.csv
id có trong ids.csv
.
loại /programming/13732295/extract-all-lines-from-text-file-basing-on-a-given-list-of-ids nhưng có vỏ, không perl.
grep -F
rõ ràng tạo ra dương tính giả nếu id có chiều rộng thay đổi.
join
là một tiện ích tôi không bao giờ có thể tìm ra. Trước hết, nó yêu cầu sắp xếp chữ cái (các tệp của tôi thường được sắp xếp theo số), nhưng ngay cả sau đó tôi không thể làm cho nó hoạt động mà không phàn nàn về thứ tự không chính xác và bỏ qua một số hồ sơ. Vì vậy, tôi không thích nó. grep -f đối với tệp có ^id\t
-s rất chậm khi số lượng id lớn.
awk
là cồng kềnh.
Có giải pháp nào tốt cho việc này không? Bất kỳ công cụ cụ thể cho các tập tin tách tab? Chức năng bổ sung sẽ được chào đón nhất.
CẬP NHẬT: Đã sửa sort
->join
awk
.
sort
có thể làm tất cả các loại sắp xếp, số, bảng chữ cái và những người khác. Xem man sort
.
grep -f
quá chậm, việc duy trì chiến lược này nghe có vẻ rắc rối hơn giá trị - các biến thể có thể sẽ trở thành con mồi cho cùng các vấn đề về hiệu suất O (N * M). Có lẽ thời gian của bạn sẽ tốt hơn dành cho việc học cách sử dụng SQL DB được chuẩn hóa ...