2016-04-10 2 views
0

Ich habe eine Liste List1, die ich nach bestimmten inet-Werten sortieren muss.Liste Sortieren mit mehreren Werten

proc compare {a b} { 
set L1 [ ] #Where L1 contain inet0 
set L2 [ ] # Where L2 contain inet15 
. 
. 
. 
} 

set sortedList [ lsort -command compare List1] 

List1 hier Bezug auf bestimmte inet Werte, die hier nicht nur interessant sind,

inet15 23726 
inet0 23725 
inet1 23727 
inet31 23724 
inet47 23720 
inet5 23715 
inet6 23727 

Prozess return List1 sollte nach sortierten inet sortiert .... wie. Ich benutze ältere Version von tcl.

inet0 23725 
inet1 23727 
inet2 23758 
inet5 23715 
inet15 23726 
inet31 23724 
+0

können Sie den Inhalt von Liste1 und Liste2 und dem erwarteten Ausgang zur Verfügung stellen? Von dem, was oben verfügbar ist, konnte ich kein Muster in der linken oder der rechten Spalte finden. – Sharad

+0

Wie dies ist eine list1 23726 23725 23727 23724 23720 23715 23727, und ich habe eine proc erstellt, die sortierte list1 zurückgeben sollte, so dass ich in diesem proc Nettowerte mit bestimmten API extrahieren. also 23726 inet15 ... und so weiter in der obigen ersten Liste. So wird die Prozedur list1 nach inet0, inet1 Werten sortieren. Am Ende werde ich list1 durch nach den inet Namen sortiert haben, die am Ende aussehen wird: inet0 23725 INET1 23727 inet2 23758 inet5 23715 inet15 23726 inet31 23724 – Dynamo

Antwort

0

Sie können einfach nutzen die -dictionary Option in lsort Befehl machen.

set input "inet15  inet0  inet1  inet31  inet47  inet5  inet6  inet7  inet8  inet9  inet10  inet11  inet32  inet13  inet14  inet2  inet16  inet17  inet18  inet20  inet19  inet21  inet22" 
puts [lsort -dictionary $input] 

Ausgang:

inet0 inet1 inet2 inet5 inet6 inet7 inet8 inet9 inet10 inet11 inet13 inet14 inet15 inet16 inet17 inet18 inet19 inet20 inet21 inet22 inet31 inet32 inet47 

Sobald Sie diese Liste haben, können Sie einfach die Abbildung von der anderen Liste bekommen.

0

Der einfachste Weg mit diesen Daten ist die Verwendung der -stride und -index Optionen zu lsearch. -stride teilt die Liste in Unterlisten auf, die nach Einheiten sortiert sind, und -index wird verwendet, um auszuwählen, welches Element in einer Unterliste der Sortierschlüssel ist. Schließlich, die -dictionary Option tut genau die Art der Sortierung über die Schlüssel, die Sie suchen (es behandelt Buchstaben-Sequenzen und eingebettete Zahlen als besondere Dinge).

set sortedList [lsearch -stride 2 -index 0 -dictionary $List1] 

jedoch Sie scheinen auch die Zeilenumbrüche beibehalten möchten. Das ist möglich, erfordert aber eine etwas andere Verarbeitung.

Die Umwandlung zu einem Einzeiler bleibt als Übung für den Leser übrig.

+0

Ich verwende ältere Version 8.4 – Dynamo

0

Es ist nicht ersichtlich, was der Inhalt der Liste ist. Hier ist ein Ansatz, bei dem ein Array Schlüssel als Elemente aus Liste1 und Werte aus Liste2 enthält. Sie können dann über die sortierte Liste von Array-Elementen iterieren und die sortierte Ausgabe erhalten, wie Sie oben sehen konnten.

[email protected]:~$ cat my.tcl 
array set foo { 
    inet15 23726 
    inet0 23725 
    inet1 23727 
    inet31 23724 
    inet47 23720 
    inet5 23715 
    inet6 23727 
} 

foreach inet [lsort -dictionary [array names foo]] \ 
{ 
    set value $foo($inet) 
    puts $inet=$value 
} 
[email protected]:~$ 

Output: 
[email protected]:~$ tclsh my.tcl 
inet0=23725 
inet1=23727 
inet5=23715 
inet6=23727 
inet15=23726 
inet31=23724 
inet47=23720 
[email protected]:~$ 
0
proc sortit { anum bnum } { 
    set aname [zapper::extractname $anum] 
    set bname [zapper::extract name $bnum] 
    set sortnames [lsort -dictionary [list $aname $bname]] 
    if { [ index $sortnames 0 ] != $aname } { 
     return -1} else { 
      return 1 
     } 
    return [list sortie [ lindex $anum 0] [ lindex $bnum 0 ]] 
    } 

dies mit genannt:

lsort -command sortit $List1