2010-04-12 25 views

Trả lời

29

Dưới đây là một ví dụ đơn giản để giúp bạn đi:

echo "81 4 6 12 3 0" | tr " " "\n" | sort -g

tr dịch các không gian phân chia ranh giới các con số, thành kí tự xuống dòng, bởi vì loại sử dụng kí tự xuống dòng như delimiters (tức là nó là để phân loại dòng của văn bản). Tùy chọn -g cho biết sắp xếp sắp xếp theo "giá trị số chung".

man sort để biết thêm chi tiết về sort.

+3

Tôi nối thêm một '| tr' với các tham số đảo ngược để có được một chuỗi phân cách không gian trở lại. – isuldor

+0

Để đảo ngược sắp xếp, sử dụng '-r'. – Tim

2
$ s=(one two three four) 
$ sorted=$(printf "%s\n" ${s[@]}|sort) 
$ echo $sorted 
four one three two 
3

Đây là một biến thể của câu trả lời ghostdog74 của đó là quá lớn để vừa trong một chú thích. Nó cho thấy chữ số thay vì tên của các số và cả chuỗi gốc và kết quả là trong các chuỗi được phân tách bằng dấu cách (thay vì một mảng trở thành một chuỗi được phân tách bằng dòng mới).

$ s="3 2 11 15 8" 
$ sorted=$(echo $(printf "%s\n" $s | sort -n)) 
$ echo $sorted 
2 3 8 11 15 
$ echo "$sorted" 
2 3 8 11 15 

Nếu bạn không sử dụng echo khi thiết lập các giá trị của sorted, sau đó chuỗi có dòng mới trong đó. Trong trường hợp đó lặp lại nó mà không có dấu ngoặc kép đặt tất cả trên một dòng, nhưng, như vang vọng nó với dấu ngoặc kép sẽ hiển thị, mỗi số sẽ xuất hiện trên dòng riêng của nó. Đây là trường hợp bản gốc là một mảng hay một chuỗi.

# demo 
$ s="3 2 11 15 8" 
$ sorted=$(printf "%s\n" $s | sort -n) 
$ echo $sorted 
2 3 8 11 15 
$ echo "$sorted" 
2 
3 
8 
11 
15 
1

Sử dụng mở rộng tham số Bash (để thay dấu cách bằng dòng mới), chúng tôi có thể làm:

str="3 2 11 15 8" 
sort -n <<< "${str// /$'\n'}" 

# alternative 
NL=$'\n' 
str="3 2 11 15 8" 
sort -n <<< "${str// /${NL}}" 
0

Nếu bạn thực sự có một chuỗi không gian được phân định các con số, sau đó một trong những câu trả lời khác được cung cấp sẽ làm việc khỏe. Nếu danh sách của bạn là mảng bash, thì:

oldIFS="$IFS" 
IFS=$'\n' 
array=($(sort -g <<< "${array[*]}")) 
IFS="$oldIFS" 

có thể là giải pháp tốt hơn. Dấu phân cách dòng mới sẽ giúp nếu bạn muốn khái quát hóa để sắp xếp một chuỗi các chuỗi thay vì các số.

+0

danh sách của tôi là một mảng bash, nhưng điều này không làm việc cho tôi: 'packages =" $ (sắp xếp <<< $ {! Package2apk [@]}) "' – Jayen

0
$ awk 'BEGIN{split(ARGV[1], numbers);for(i in numbers) {print numbers[i]} }' \ 
    "6 7 4 1 2 3" | sort -n 
+0

Mặc dù đoạn mã này có thể là giải pháp, [bao gồm giải thích] (// meta.stackexchange.com/questions/114762/explaining-entirely-‌ code-based-answers) thực sự giúp cải thiện chất lượng bài đăng của bạn.Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. – yivi

0

Cải thiện về Bash đẹp Evan Krall của "mảng loại" bằng cách giới hạn phạm vi của IFS cho một lệnh duy nhất:

printf "%q\n" "${IFS}" 
array=(3 2 11 15 8) 
array=($(IFS=$'\n' sort -n <<< "${array[*]}")) 
echo "${array[@]}" 
printf "%q\n" "${IFS}" 
3

Đây là một biến thể từ @JamesMorris câu trả lời:

echo "81 4 6 12 3 0" | xargs -n1 | sort -g | xargs 

Thay vì tr, tôi sử dụng xargs -n1 để chuyển đổi sang dòng mới. Cuối cùng xargs là để chuyển đổi trở lại, thành một dãy số cách nhau bằng dấu cách.

Các vấn đề liên quan