Mỗi khóa là duy nhất (không trùng lặp) và có một số dòng bằng nhau trong mỗi tệp.
Giả định này rất quan trọng. Nếu nó giữ thì lệnh này sẽ thực hiện công việc (trong Bash):
paste <(nl key.file | sort -k 2 | cut -f 1) <(sort data.file) | sort -n | cut -f 2-
Rất ít công cụ sử dụng các ký tự tab làm dấu phân cách. Vì lý do này, các tab không được xuất hiện key.file
( data.file
mặc dù chúng có thể xảy ra ). Các mục nhập Sane key.file
nên tạo thành một cột duy nhất, vì vậy nó không phải là một vấn đề.
Giải trình:
nl
thêm một số dòng ở phía trước của mỗi dòng key.file
; điều này làm cho các phím tự di chuyển đến cột thứ hai; sort -k 2
sắp xếp theo cột thứ hai, tức là theo các phím. Các phím này sau đó bị loại bỏ cut -f 1
.
- Một
sort
loại khác data.file
. Vì các phím ở phía trước là duy nhất, nên cách sắp xếp mặc định này tương đương với sắp xếp theo các phím duy nhất.
Hai kết quả từ sort
-s được hợp nhất bởi paste
. Nếu không có cut
dòng ví dụ đầu tiên sẽ là:
4 T01F01475558 T01F01475558 30
Tính duy nhất của các khóa và số lượng bằng nhau của chúng trong cả hai tệp là rất quan trọng. Trong thực tế, các khóa giống nhau từ cả hai sort
-s gặp nhau trong cùng một dòng paste
. Vì bạn không cần các khóa trùng lặp để chiếm bộ nhớ, nên lần đầu tiên cut
được sử dụng càng sớm càng tốt. Với nó, ví dụ thực tế để lại paste
là:
4 T01F01475558 30
Những dòng này sau đó được sắp xếp theo giá trị số của chúng. Số dòng từ nl
phía trước, vì vậy thao tác này giới thiệu thứ tự mong muốn.
- Cuối cùng,
cut
loại bỏ cột đầu tiên, để lại các dòng chính xác data.file
, nhưng theo thứ tự mong muốn.
Ngoài ra, bạn có thể thử điều này (được thử nghiệm trong Bash):
while IFS='' read -r ; do
[ -n "$REPLY" ] && grep "^$REPLY " data.file
done <key.file
Lưu ý mã mong đợi một ký tự khoảng trắng sau mỗi khóa data.file
.
Ưu điểm:
key.file
có thể chỉ định bất kỳ số lượng khóa, khóa trùng lặp, khóa không tồn tại. Trong trường hợp này, đừng nghĩ "sắp xếp", hãy nghĩ "lấy từng dòng mong muốn".
- Bạn có thể truyền phát đầu vào (như stdin thay vì
key.file
, chỉ cần bỏ qua <key.file
) và nhận đầu ra một cách nhanh chóng.
Nhược điểm:
grep
sẽ diễn giải các khóa như các biểu thức thông thường, điều này có thể phản tác dụng. Có grep -F
nhưng nói chung bạn cần ^
trong mô hình.
read
là chậm; sinh sản grep
nhiều lần là chậm; mở đi mở data.file
lại là chậm.