2017-11-13 1 views
0

Ich habe ein Array das enthält Element wie 1617b, 1516a und dergleichen. Ich möchte die Elemente in absteigender Reihenfolge wiedergeben - das sind die mit den größten Zeichen in ihnen und wenn sie identisch sind mit denen mit größeren Buchstaben. Irgendeine Idee, wie man das macht? Wird ein einfaches "wenn" funktionieren? Wie in:Bash: Wie vergleicht man Strings mit Zahlen und Buchstaben?

if [[ ${array[$j]}>${array[$j+1]} ]]; then 
    . 
    . 
    . 

tnx im Voraus

+0

Ich schlage vor, alle nachfolgenden Buchstaben zu entfernen: 'echo" $ {array [$ j]/[a-z] * /} "' – Cyrus

+0

ja, aber ich muss immer noch die Buchstaben überprüfen, wenn ich vergleiche. Ich denke, ich kann nur schneiden (es gibt immer 4 Nummern, dann einen Buchstaben). aber wie vergleiche ich dann buchstaben? weiß die Shell, dass B zum Beispiel größer als A ist? – doronbs11

+1

Wenn es immer genau 4 Ziffern und einen Buchstaben gibt, sollte der lexikographische Vergleich gut funktionieren, Sie müssen ihn nicht in Zahlen und Buchstaben aufteilen. – Barmar

Antwort

0

hier ist ein Weg,

$ ar=(1234a 2345b 1234c 4444d) 
$ sorted=$(printf "%s\n" ${ar[@]} | sort | xargs) 
$ echo $sorted 

1234a 1234c 2345b 4444d 

für absteigend -r Flagge sort

hinzufügen, wenn Sie Ihre sortierten Werte zurück auf ein Array wollen

$ sorted_ar=($(printf "%s\n" ${ar[@]} | sort)) 
$ echo ${sorted_ar[@]} 
+1

Was ist der Zweck von 'Xargs' hier? Und sollte es nicht "sortierte = ($ (...))" (mit extra parens) sein? –

+0

ja, die erste Ausgabe ist kein Array, also um die Werte auf die selbe Zeile mit 'xargs' zu serialisieren. Zweite Option hinzugefügt, um Werte zurück in Array zu konvertieren, wobei 'xargs' nicht benötigt und hinzugefügt wird. – karakfa

+0

Oh, ich verstehe es jetzt: es ist die Zeilenumbrüche zu entfernen. –

Verwandte Themen