Eliminar valores duplicados de una matriz de PowerShell

109

¿Cómo puedo eliminar duplicados de una matriz de PowerShell?

$a = @(1,2,3,4,5,5,6,7,8,9,0,0)
Eric Schoonover
fuente

Respuestas:

193

Use Select-Object(cuyo alias es select) con el -Uniqueinterruptor; p.ej:

$a = @(1,2,3,4,5,5,6,7,8,9,0,0)
$a = $a | select -Unique
Keith Hill
fuente
9
Eso fue demasiado fácil :-(. En PowerShell 2 también puede usar Get-Unique(o gu) si su matriz ya está ordenada.
Joey
2
Johannes, Get-Unique está disponible en v1 :)
Shay Levy
2
genial, esto funciona bien, solo una nota, si quieres ser conciso, podría acortarse incluso a -u. select -uSelect-Object -Unique
Usaría
¿Esto solo funciona con un solo dígito? Para una gran lista de matrices, parece que no funciona.
EagleDev
85

Otra opción es usar Sort-Object(cuyo alias es sort, pero solo en Windows) con el
-Uniqueinterruptor, que combina la clasificación con la eliminación de duplicados:

$a | sort -unique
Shay Levy
fuente
2
Esto también resuelve mi próximo problema, que es cómo lo soluciono. ¡Gracias!
Usuario registrado
2
Este también parece un poquito más rápido.
Gneo Pompeo
7

En caso de que quiera ser una prueba de bomba completa, esto es lo que le aconsejaría:

@('Apples', 'Apples ', 'APPLES', 'Banana') | 
    Sort-Object -Property @{Expression={$_.Trim()}} -Unique

Salida:

Apples
Banana

Esto usa el Propertyparámetro para primero Trim()las cadenas, por lo que los espacios adicionales se eliminan y luego selecciona solo los -Uniquevalores.

Más información sobre Sort-Object:

Get-Help Sort-Object -ShowWindow
DarkLite1
fuente
1
Respuesta impresionante. Resolvió mi problema, Get-Uniqueno funcionó porque hay espacios
Kolob Canyon
7
$a | sort -unique

Esto funciona con mayúsculas y minúsculas, por lo que elimina cadenas duplicadas con diferentes casos. Resolvió mi problema.

$ServerList = @(
    "FS3",
    "HQ2",
    "hq2"
) | sort -Unique

$ServerList

Los resultados anteriores:

FS3
HQ2
Briscomo
fuente
esto también funciona bien para matrices con varios miembros
JoeRod
4

Si la lista está ordenada, puede usar el cmdlet Get-Unique :

 $a | Get-Unique
Martín Brandl
fuente
2
Requiere que la lista se
ordene de
2

Con mi método, puede eliminar por completo los valores duplicados, dejándolo con valores de la matriz que solo tenían un recuento de 1. No estaba claro si esto era lo que realmente quería el OP, sin embargo, no pude encontrar un ejemplo de esta solución en línea, así que aquí está.

$array=@'
Bananna
Apple
Carrot
Pear
Apricot
Pear
Bananna
'@ -split '\r\n'

($array | Group-Object -NoElement | ?{$_.count -eq 1}).Name
Será
fuente
2

Ya sea que esté utilizando SORT -UNIQUE, SELECT -UNIQUEo GET-UNIQUEde Powershell 2.0 a 5.1, todos los ejemplos dados están en matrices de una sola columna. Todavía tengo que hacer que esto funcione en matrices con múltiples columnas para ELIMINAR filas duplicadas para dejar apariciones únicas de una fila en dichas columnas, o desarrollar una solución de script alternativa. En cambio, estos cmdlets solo han devuelto filas en una matriz que se produjeron UNA VEZ con una aparición singular y volcaron todo lo que tenía un duplicado. Por lo general, tengo que Eliminar duplicados manualmente de la salida CSV final en Excel para finalizar el informe, pero a veces me gustaría seguir trabajando con dichos datos dentro de Powershell después de eliminar los duplicados.

Christopher M Ramos
fuente
aquí es donde el objeto Where resulta útil. Primero se reduce la lista usando la cláusula where de la derecha, luego se canaliza a un objeto de clasificación, se selecciona una o más columnas para clasificar y se asigna al objeto de clasificación un -unique.
LPChip