2012-07-11 16 views
5

Ich habe eine große Menge von Gegenständen und möchte Gegenstände daraus extrahieren. Ich muss einige Elemente vom Start und einige vom Ende überspringen.Wie extrahiere ich einen Bereich aus einer Sammlung in Powershell?

Das folgende Beispiel ist vereinfacht.

Ich versuchte zunächst, die Begrenzungselemente zu extrahieren:

> ("a", "b", "c", "d", "e")[1,-2] 
b 
d 

Dies funktioniert wie erwartet.

Wenn ich jedoch versuchte, den gesamten Bereich zu extrahieren, gibt es etwas anderes zurück, als ich möchte (im Gegensatz zu Pythons , die gut funktioniert).

> ("a", "b", "c", "d", "e")[1..-2] 
b 
a 
e 
d 

Es läuft in umgekehrter Richtung. Wie ändere ich die Richtung der Schleife?

Ich möchte erhalten: b c d.

Gibt es eine Lösung ohne die tatsächliche Länge der Sammlung zu verwenden?

Antwort

5

1 ..- 2 wird nicht vom ersten bis zum letzten Punkt gezählt. Speichern Sie das Array in einer Variablen und geben Sie die Obergrenze an, indem Sie die Array-Länge abzüglich der Elemente vom Ende berechnen.

$a = "a", "b", "c", "d", "e" 
$a[1..($a.length-2)] 
+0

Ist es möglich, ohne die Länge zu verwenden? –

+0

Mir ist nicht bewusst, dass das Zuweisen des Arrays zu einer Variablen ein Teil ist, den ich auch nicht mag. Sie müssen zuerst die obere Grenze kennen, um alle Elemente außer den letzten beiden zu erhalten. –

+0

Wenn die Reihenfolge der Objekte nicht zählt, dann vielleicht mit: 'a', 'b', 'c', 'd', 'e' | sortieren | Wählen Sie -skip 1 | Sortierung -desc | Wählen Sie -skip 1 –

1

Um remov nur die ersten beiden, die Sie tun können:

$null,$null,$a = "a", "b", "c", "d", "e" 
+0

Wie von beiden Seiten entfernen? –

3

Da der Bereichsoperator nicht tut, was Sie benötigen, eine einfache Pipeline die Aufgabe in der Hand erreichen kann, wenn dieser Wille wahrscheinlich Schlagleistung für eine große Sammlung.

Beginnen Sie mit einer Sammlung und die Anzahl der Elemente von oben und von unten zu trimmen:

$a = "a", "b", "c", "d", "e" 
($fromTop,$fromBottom) = 1, 2 

verwenden ...

$a | select -skip $fromTop | select -skip $fromBottom -last 1000000 

... oder, wenn Sie PSCX installiert haben diese prägnante und elegante Sequenz:

$a | skip -first $fromTop -last $fromBottom 

dieser beiden Rück b c witho Verwenden Sie explizit die Eigenschaft length. Passen Sie die beiden Parameter an, um die Ausgabe an verschiedene Bereiche anzupassen.

Verwandte Themen