2010-04-12 17 views

Odpowiedz

29

Oto prosty przykład, aby można było:

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

tr przekłada przestrzenie wyznaczające numery, do powrotu karetki, bo sort używa karetki powraca jako ograniczniki (czyli jest do sortowania linie tekstu). Opcja -g informuje sortowanie o "ogólną wartość liczbową".

man sort w celu uzyskania dalszych informacji na temat sort.

+3

Dodałem kolejne '| tr' przy odwróconych parametrach, aby wycofać łańcuch rozdzielany spacjami. – isuldor

+0

Aby odwrócić sortowanie, użyj '-r'. – Tim

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

Jest to wariacja na ghostdog74 męska odpowiedź, która jest zbyt duża, aby zmieścić się w komentarz. Wyświetla cyfry zamiast nazw liczb, a zarówno oryginalny ciąg, jak i wynik są w łańcuchach rozdzielanych spacjami (zamiast tablicy, która staje się łańcuchem rozdzielanym znakami nowej linii).

$ 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 

Jeśli nie używać echo przy ustalaniu wartości sorted, wówczas ciąg ma nowe linie w nim. W tym przypadku echo bez cudzysłowu umieszcza wszystko w jednym wierszu, ale, jak pokazuje echo z cytatami, każda liczba pojawiałaby się w osobnej linii. Jest tak w przypadku, gdy oryginał jest tablicą lub ciągiem znaków.

# 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

Korzystanie Bash interpretacji parametrów (aby zastąpić spacje z nowymi liniami) możemy zrobić:

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

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

Jeśli rzeczywiście mają ciąg oddzielonych znakiem spacji numerów, a następnie jeden z pozostałych odpowiedzi udzielone będzie działać w porządku. Jeśli twoja lista jest tablicą bash, wówczas:

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

może być lepszym rozwiązaniem. Ogranicznik nowej linii może pomóc, jeśli chcesz uogólnić sortowanie tablicy łańcuchów zamiast liczb.

+0

Moja lista jest tablicą bash, ale to nie działa dla mnie: 'packages =" $ (sort <<< $ {! 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

Ten fragment kodu może być rozwiązaniem, [w tym wyjaśnienie] (// meta.stackexchange.com/questions/114762/explaining-entirely- code-based-answers) naprawdę pomaga poprawić jakość twojego posta.Pamiętaj, że odpowiadasz na pytanie przeznaczone dla czytelników w przyszłości, a te osoby mogą nie znać powodów sugestii dotyczących kodu. – yivi

0

Poprawa na Evan Krall ładnym Bash "array sort" przez ograniczenie zakresu IFS do jednego polecenia:

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

Jest to odmiana od @JamesMorris odpowiedź:

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

Zamiast tr używam xargs -n1 do konwersji na nowe linie. Ostateczna wersja xargs polega na konwersji z powrotem na oddzieloną spacjami sekwencję liczb.

Powiązane problemy