Sắp xếp các trường được phân tách bằng dấu phẩy trên mỗi dòng theo giá trị số


7

Tôi đã thử điều này:

$ echo "2,3435,1" | sort -n
2,3435,1

$ sort -t',' -n test_sort.txt
kill,gill,burger
110,20,30,13

$ cat test_sort.txt
110,20,30,13
kill,gill,burger

Tại sao sortlệnh của tôi không hoạt động?

sortLệnh mong muốn của tôi sẽ hoạt động như thế này:

$sort -t',' -n test_sort.txt  
110,13,20,30,burger,gill,kill

TRẢ LỜI: tr, '\ n' <a | sắp xếp -n | dán -sd, -

"Cảm ơn Stéphane Chazelas"


Cái gì không hoạt động? Sản lượng mong muốn là gì?
psimon

1
Chỉ -tđịnh những gì phân tách các trường, nhưng sortsắp xếp lại các hàng dữ liệu. Nó chỉ tham chiếu các trường trong việc xác định giá trị nào để sắp xếp theo.
Bratchley

5
tr , '\n' < a | sort -n | paste -sd, -
Stéphane Chazelas

@ Stéphane Chazelas Thưa ngài, thực sự tuyệt vời
sij

3
@ StéphaneChazelas Bạn nên đăng nó như một câu trả lời. Trả lời các câu hỏi trong các bình luận (điều mà tôi đã từng phạm tội trong quá khứ) là không mong muốn.
David Conrad

Câu trả lời:


10

sorthoạt động trên toàn bộ dòng. Theo mặc định, nó sắp xếp trên toàn bộ nội dung của dòng đó, nhưng -kcó thể được sử dụng để sắp xếp trên một hoặc nhiều trường trong các dòng đó. -tcó thể được sử dụng để thay đổi dấu phân cách giữa các trường. Tôi không thể nghĩ về một trường hợp sử dụng -tmà không sử dụng cũng -kcó ý nghĩa.

Lệnh thứ hai của bạn, tương đương với:

printf "%s\n%s\n" "110,20,30,13" "kill,gill,burger" | sort -t',' -n

sản xuất:

kill,gill,burger
110,20,30,13

Đó là những gì tôi mong đợi. -t','không có tác dụng vì nó thay đổi dấu phân cách trường khi bạn chưa nói sắp xếp hoạt động trên từng trường riêng lẻ và do đó kđược sắp xếp trước 1vì giá trị số của nó là 0 (và bạn đã yêu cầu đặt hàng số bằng cách sử dụng -n).


6

Sắp xếp hoạt động trên cơ sở từng dòng, không phải trên các trường trong một dòng.

Theo mặc định, nó sắp xếp dựa trên ký tự đầu tiên trên dòng và tiếp tục từ đó. Nhưng bạn cũng có thể sắp xếp các "phím" khác với lúc ban đầu. Điều này hữu ích khi bạn muốn sắp xếp họ hoặc giá trị số ở cuối dòng, v.v. Đó là những gì -tlá cờ dành cho - nó sẽ không phá vỡ từng dòng riêng lẻ và sắp xếp bên trong chúng.

Nếu đó là những gì bạn muốn làm, hãy xem Sắp xếp các trường nội tuyến


2

Sắp xếp theo dấu phẩy là một phần có thể:

echo "a,b,z,sa,b,z,a,d,2,4a,a,dx" | tr , "\n" | sort

Đầu ra

2
4a
a
a
a
b
b
d
dx
sa
z
z

Và nếu bạn muốn nó trở lại trên một dòng:

echo "a,b,z,sa,b,z,a,d,2,4a,a,dx" | tr , "\n" | sort | tr "\n" ,

paste -sd , -sẽ tốt hơntr "\b" ,
Stéphane Chazelas

1

Nó sẽ dễ dàng hơn với perl:

$ perl -F',' -anle '
    BEGIN { $" = "," }
    print "@{[sort {$a <=> $b} @F]}"
' file 
13,20,30,110
kill,gill,burger

Điều này chỉ sắp xếp các dòng có chứa số. Nếu bạn muốn các dòng sắp xếp chứa chuỗi như sort -nhiện, hãy thử:

$ $ perl -MPOSIX=isdigit -F',' -anle '
BEGIN { $" = "," }
print "@{[ sort { isdigit($a)
              ? ($a <=> $b)
              : ($a cmp $b)
              } @F
        ]}"
' file
13,20,30,110
burger,gill,kill

Cách tiếp cận này vẫn chỉ hoạt động nếu like chỉ chứa chuỗi, thất bại với like chứa chuỗi hỗn hợp, số like kill,gill,20.

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.