sắp xếp mọi trường số, số lượng trường khác nhau


7

Tôi đang cố gắng sắp xếp một số dữ liệu bằng cách sử dụng sort. Tôi nhận thấy nó được sắp xếp theo chữ số chứ không phải số, vì vậy tôi đã thêm -ncờ. Sau đó, nó dường như chỉ sắp xếp số trên trường đầu tiên. Việc chia nhỏ nó theo trường là một vấn đề vì các dòng có số lượng trường khác nhau (và thật lòng mà nói, tôi không thể hiểu hành vi của nó). Đây là một số dữ liệu mẫu đủ gần mà tôi đang chơi với:

echo -e "b b 1\n23 44\nb 3\na 7\nb b 2\na 1\nb a 10\nb b 10\nb 1\nb a 1\n18 2\nb 10\n18 15\nb a 2\n23 9\nb 2" | sort -n

Input     Want      Expect?   sort      -n        -n -k1,1 -k2,2 -k3,3 -k4,4…

b b 1     8 2       a 1       23 44     a 1       b a 1
23 44     8 15      a 7       23 9      a 7       b a 10
b 3       23 9      b a 1     8 15      b 1       b a 2
a 7       23 44     b a 2     8 2       b 10      b b 1
b b 2     a 1       b a 10    a 1       b 2       b b 10
a 1       a 7       b b 1     a 7       b 3       b b 2
b a 10    b 1       b b 2     b 1       b a 1     a 1
b b 10    b 2       b b 10    b 10      b a 10    b 1
b 1       b 3       b 1       b 2       b a 2     b 2
b a 1     b 10      b 2       b 3       b b 1     b 3
8 2       b a 1     b 3       b a 1     b b 10    a 7
b 10      b a 2     b 10      b a 10    b b 2     b 10
8 15      b a 10    8 2       b a 2     8 15      8 2
b a 2     b b 1     8 15      b b 1     8 2       8 15
23 9      b b 2     23 9      b b 10    23 44     23 9
b 2       b b 10    23 44     b b 2     23 9      23 44

Lý tưởng nhất là tôi muốn làm cho nó hoạt động trên chính cỗ máy đó, có lõi GNU loại 5,93. Tôi muốn xử lý nó với các công cụ unix đơn giản; Tôi không muốn chỉ đưa vấn đề cho perl, v.v. Tôi hy vọng tương đương với [tưởng tượng]sort --numeric-sort --all-fields --actually-work

Câu trả lời:


1

Với những lợi ích do một vài năm phát triển, sort -Vvề sort 8.26sản xuất chỉ sản lượng truy nã:

$ echo -e "b b 1\n23 44\nb 3\na 7\nb b 2\na 1\nb a 10\nb b 10\nb 1\nb a 1\n8 2\nb 10\n8 15\nb a 2\n23 9\nb 2" \
   | sort -V
8 2
8 15
23 9
23 44
a 1
a 7
b 1
b 2
b 3
b 10
b a 1
b a 2
b a 10
b b 1
b b 2
b b 10

7

Tôi nghĩ rằng vấn đề của bạn là bạn không hiểu những gì sortđang làm. Sắp xếp cơ bản dựa trên các giá trị ký tự ASCII, trong đó các số nằm trước chữ hoa trước chữ thường: '1' == 49, 'A' == 65, 'a' = 97. Điều đó giải thích sortcột, trong đó các số như '23 'được sắp xếp trước' 8 ', trước' b b ': giá trị ASCII cho' 2 'là 50, giá trị ASCII cho' 8 'là 56 và cho' b 'là 98.

Khi sắp xếp số ( sort -n), các mục không phải là số được sắp xếp theo phương thức thông thường, nhưng được hiểu là 0 khi so sánh với các số, như 23 hoặc 8; nhưng vì giá trị được coi là số, không phải giá trị ký tự, '8' nằm trước '23'. Vì vậy, các mục nhập chữ cái sẽ sắp xếp trước các mục số.

Đặt cược tốt nhất của bạn là bình thường hóa dữ liệu để mỗi cột có cùng loại giá trị: tất cả các số hoặc tất cả các số alpha và sắp xếp một cách thích hợp.

Trong cột cuối cùng (sắp xếp theo trường), nó sẽ sắp xếp các mục có nhiều trường trước vì bạn chỉ định rõ ràng 4 (hoặc nhiều hơn) các trường. Vì vậy (1,2,3) sẽ là trước (1,2). Nếu không có -ktùy chọn, sort sẽ đưa toàn bộ dòng vào tài khoản.

Bạn có thể đọc thêm thông tin trên trang sắp xếp thông tin coreutils .


3
echo -e "b b 1\n23 44\nb 3\na 7\nb b 2\na 1\nb a 10\nb b 10\nb 1\nb a 1\n18 2\nb 10\n18 15\nb a 2\n23 9\nb 2" \
| sed -r 's/[a-z]/9999&/g' | sort -n -k1 -k2 -k3 | sed 's/9999//g' 
18 2
18 15
23 9
23 44
a 1
b 1
b 2
b 3
a 7
b 10
b a 1
b b 1
b a 2
b b 2
b a 10
b b 10

Đây có phải là những gì bạn muốn? Sắp xếp số, nếu số và số trước các ký tự khác?

Tôi đặt tiền tố cho mỗi Chuỗi có số cao, để đặt Chuỗi cuối cùng bằng cách sắp xếp và xóa số cao (9999) ở cuối.

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.