Sắp xếp dữ liệu theo thứ tự giảm dần của cột đầu tiên, cho các giá trị bằng nhau, sử dụng cột thứ hai theo thứ tự tăng dần


22

Cho phép tôi làm rõ:

Giả sử tôi có một số từ khóa với tần suất sử dụng của chúng:

12 Hi
7  Hash
7  C++  
9  Superuser
17 Stackoverflow
9  LaTeX  
42 Life
9  Ubuntu

Những gì tôi muốn, là sắp xếp dữ liệu này dựa trên tần số theo thứ tự giảm dần và nếu có một số giá trị bằng nhau, thì nên sử dụng cột thứ hai theo thứ tự tăng dần.

sort -n -r foo.txt

Có phần đầu tiên nhưng sau đó cột thứ hai cũng reversed:

42 Life
17 Stackoverflow
12 Hi
9  Ubuntu
9  Superuser
9  LaTeX  
7  Hash
7  C++

Làm thế nào tôi có thể đạt được kết quả sau đây?

42 Life
17 Stackoverflow
12 Hi
9  LaTeX  
9  Superuser
9  Ubuntu
7  C++ 
7  Hash

Tôi nghĩ rằng tôi phải sử dụng -kđối số nhưng tôi không thể tìm ra cách!

Tôi muốn biết làm thế nào điều này có thể được thực hiện bằng cách chỉ sử dụng sortlệnh của bash. Tuy nhiên, nếu không thể đạt được điều này chỉ bằng cách sort, các lệnh khác phải tương thích với vỏ Bourne.


[Một chút OT]: mặc dù tương đương với dữ liệu cụ thể này, sử dụng -gtùy chọn GNU-sort (số chung) thay vì -nso sánh bằng số sẽ an toàn hơn: nó hoạt động chính xác cho cả dấu phẩy động và số nguyên.
thân

Câu trả lời:


32

Chỉ định các khóa sắp xếp riêng biệt với các tiêu chí:

sort -k1,1nr -k2,2 inputfile

Điều này xác định rằng khóa đầu tiên được sắp xếp theo số thứ tự ngược lại trong khi khóa thứ hai được sắp xếp theo thứ tự sắp xếp mặc định .

Trích dẫn từ loại POSIX :

-k keydef

Đối số keydef là một định nghĩa trường khóa sắp xếp hạn chế. Định dạng của định nghĩa này là:

trường_start [ loại ] [ , field_end [ loại ]]

trong đó field_startfield_end xác định trường khóa được giới hạn ở một phần của dòng (xem phần MÔ TẢ TUYỆT VỜI ) và loại là một công cụ sửa đổi từ danh sách các ký tự 'b', 'd', 'f', 'i', ' n ',' r '. Công cụ sửa đổi 'b' sẽ hoạt động giống như -btùy chọn, nhưng sẽ chỉ áp dụng cho trường_start hoặc field_end mà nó được đính kèm. Các sửa đổi khác sẽ hoạt động giống như các tùy chọn tương ứng, nhưng chỉ áp dụng cho trường khóa mà chúng được gắn vào; chúng sẽ có hiệu ứng này nếu được chỉ định với field_start , field_end hoặc cả hai., không có tùy chọn sẽ được áp dụng cho một trong hai. Việc triển khai sẽ hỗ trợ ít nhất chín lần xuất hiện của -ktùy chọn, điều này có ý nghĩa trong thứ tự dòng lệnh. Nếu không có -ktùy chọn nào được chỉ định, khóa sắp xếp mặc định của toàn bộ dòng sẽ được sử dụng.

Khi có nhiều trường khóa, các khóa sau chỉ được so sánh sau khi tất cả các khóa trước đó so sánh bằng nhau. Trừ khi -utùy chọn được chỉ định, đường dây mà nếu so sánh tương đương sẽ được ra lệnh, nếu như không ai trong số các tùy chọn -d, -f, -i, -n, hoặc -kđã có mặt (nhưng với -r vẫn có hiệu lực, nếu nó đã được chỉ định) và với tất cả các byte trong dòng đáng kể cho so sánh. Thứ tự mà các dòng vẫn so sánh bằng nhau được viết là không xác định.

Điều này sẽ tạo ra:

42 Life
17 Stackoverflow
12 Hi
9  LaTeX
9  Superuser
9  Ubuntu
7  C++
7  Hash

Cảm ơn. Đã lừa Phải đợi 10 phút để chấp nhận!
Pouya

@StephaneChazelas Cảm ơn bạn đã chỉ ra; cập nhật tài liệu tham khảo.
devnull
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.