Mặc dù nó quá mức cần thiết cho ví dụ hiện tại vì giải pháp được đề xuất trong câu trả lời của user68186, nói chung bạn có thể làm điều gì đó như thế này trong GNU awk:
trố mắt -F/'
hàm mycmp(i1,v1,i2,v2) {
m = chia(v1,a);
n = tách(v2,b);
trả về a[m]""> b[n]"" ? 1 : a[m]"" < b[n]"" ? -1 : 0
}
{
dòng[NR] = $0
}
CHẤM DỨT {
PROCINFO["sorted_in"] = "mycmp";
for(i in lines) print lines[i]
}
' tập tin
Lưu ý rằng nó sắp xếp theo giá trị từ vựng của mọi thứ sau từ cuối cùng /
- vì vậy nếu định dạng là Tác giả-<tên tác giả>-<tiêu đề>.<phần mở rộng>
đó sẽ là
- chuỗi cố định
Tác giả-
(không có tác dụng, vì nó có cùng trọng lượng cho tất cả các dòng); sau đó
<tên tác giả>-
; sau đó
<tiêu đề>.
; sau đó
<extension>
Điều này tương tự như cách GNU loại
KEYDEF đơn giản -t- -k2
hoạt động tức là khóa sắp xếp hiệu quả bắt đầu từ <author name>
và tiếp tục đến cuối dòng.
Một dấu phân cách rõ ràng được bỏ qua từ tách ra
các cuộc gọi để họ kế thừa giá trị của FS
, giúp dễ dàng thay đổi đối với các hệ thống sử dụng dấu tách đường dẫn khác. Các chuỗi trống nối thêm ""
bên trong mycmp
chức năng buộc so sánh từ vựng ngay cả khi tên tệp là số - xem ví dụ Cách awk chuyển đổi giữa chuỗi và số
Nếu bạn muốn gắn bó với loại
lệnh, bạn có thể tận dụng GNU awk's Truyền thông hai chiều với quy trình khác đến:
- nhân bản cuối cùng
/
-trường được phân tách ở đầu chuỗi
- chuyển kết quả cho a
loại
chỉ huy
- đọc lại kết quả đã sắp xếp, loại bỏ tiền tố trùng lặp và in
I E.
trố mắt -F/'
BẮT ĐẦU {OFS=FS; cmd = "sắp xếp -d"}
{in $NF $0 |& cmd}
CHẤM DỨT {
close(cmd,"to");
while(cmd |& getline){$1 = ""; in};
đóng(cmd,"từ")
}
' tập tin
Có một chút gian lận ở đây trong đó các đường dẫn tuyệt đối (các dòng bắt đầu bằng /
) ngụ ý một trường trống ban đầu; để xử lý các đường dẫn tương đối, bạn cần thay đổi in $NF $0
đến in $NF,$0
để chèn dấu phân cách "bị thiếu" và sau đó có thể sử dụng biểu thức chính quy phụ()
thay vì đơn giản hơn $1 = ""
để loại bỏ phần tử hàng đầu.
Cũng như có khả năng nhanh hơn/hiệu quả bộ nhớ hơn so với thuần túy trố mắt nhìn
giải pháp, điều này cho phép khác loại
các tùy chọn được thêm vào một cách đơn giản, ví dụ: cmd = "sắp xếp -d -t " FS " -k1,1r"
.