sử dụng sắp xếp GNU để sắp xếp theo một khóa duy nhất / ngăn chặn các khóa khác không mong muốn


9

Tôi có một tệp chứa dữ liệu đã được đặt hàng và tôi muốn sắp xếp lại tệp theo các giá trị trong một khóa, mà không phá hủy thứ tự của dữ liệu trong các khóa khác.

Làm cách nào để ngăn sắp xếp GNU thực hiện sắp xếp hàng dựa trên các giá trị của khóa mà tôi chưa chỉ định hoặc làm cách nào để chỉ định sắp xếp GNU để bỏ qua một phạm vi khóa khi sắp xếp?

Tệp data.txt:

1 Don't
2 C 
1 Sort
2 B
1 Me
2 A

Sản lượng dự kiến:

1 Don't
1 Sort
1 Me
2 C
2 B
2 A

Chỉ huy:

sort -k 1,1 <data.txt

Kết quả: sắp xếp không mong muốn Tôi không yêu cầu:

1 Don't
1 Me
1 Sort
2 A
2 B
2 C

Câu trả lời:


21

Bạn cần một loại ổn định . Từ man sort:

-s, --stable
       stabilize sort by disabling last-resort comparison

viz.:

$ sort -sk 1,1 <data.txt
1 Don't
1 Sort
1 Me
2 C 
2 B
2 A

Lưu ý rằng bạn cũng có thể muốn một -nhoặc --numeric-sortnếu khóa của bạn là số (ví dụ: bạn có thể nhận được kết quả không mong muốn khi so sánh 10 với 2 với thứ tự sắp xếp mặc định - từ vựng - mặc định). Trong trường hợp đó chỉ là vấn đề làm:

sort -sn <data.txt

Không cần trích xuất trường đầu tiên vì việc giải thích số của toàn bộ dòng sẽ giống như trường đầu tiên.



Tôi đọc các tài liệu nhưng định nghĩa đúng về "ổn định" đã lảng tránh sự chú ý của tôi. Cảm ơn cho phản ứng nhanh chóng, súc tích, và trích dẫn tốt. Khóa đầu tiên của dữ liệu thực là một chuỗi cục bộ, do đó, số sẽ không hoạt động với tôi.
Wil

4

Đối với các sorttriển khai (không phải GNU) thiếu -stùy chọn, bạn luôn có thể thực hiện:

<data.txt awk '{print NR "\t" $0}' | sort -n -k 2,2 -k 1,1 | cut -f 2-

Đó là, thêm số dòng để biến nó thành khóa sắp xếp thứ hai và tước nó sau đó.

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.