Solución:
Puedes usar el Group-Object
cmdlet:
PS> 1,1,1,2,2,3,4,4,4,4,5,5 | group
Count Name Group
----- ---- -----
3 1 {1, 1, 1}
2 2 {2, 2}
1 3 {3}
4 4 {4, 4, 4, 4}
2 5 {5, 5}
Si desea una tabla hash para los artículos y sus recuentos, solo necesita un poco ForEach-Object
después de:
$array | group | % { $h = @{} } { $h[$_.Name] = $_.Count } { $h }
Puede ajustar la salida y formatearla como desee:
PS> $ht= 1,1,1,2,2,3,4,4,4,4,5,5 | Group-Object -AsHashTable -AsString
PS> $ht
Name Value
---- -----
2 {2, 2}
4 {4, 4, 4, 4}
5 {5, 5}
1 {1, 1, 1}
3 {3}
PS> $ht['1']
1
1
1
La útil respuesta de Joey proporciona el puntero crucial: utilizar el Group-Object
cmdlet para agrupar objetos de entrada por igualdad.
(Para agruparlos por uno o más de sus valores de propiedad en su lugar, usa -Property
).
Group-Object
salidas [Microsoft.PowerShell.Commands.GroupInfo]
objetos que cada uno representa un grupo de objetos de entrada iguales, cuyas propiedades notables son:
-
.Values
… los valores que definen el grupo, como un[System.Collections.ArrayList]
instancia (que acaba de 1 elemento en el caso que nos ocupa, ya que los objetos de entrada como un todo se utilizan para formar los grupos). -
.Count
… el recuento de objetos en ese grupo.
Si, como en este caso, no es necesario reunir a los miembros individuales del grupo como parte de cada grupo, -NoElement
se puede utilizar para mayor eficiencia.
Puede seguir procesando los objetos de grupo según sea necesario; para obtener el formato de salida específico estipulado en su pregunta, puede usar Select-Object
con una propiedad calculada.
Para ponerlo todo junto:
PS> 1, 1, 1, 2, 2, 3, 4, 4, 4, 4, 5, 5 | Group-Object -NoElement |
Select-Object @{ n='Element:Count'; e={ '{0}:{1}' -f $_.Values[0], $_.Count } }
Element:Count
-------------
1:3
2:2
3:1
4:4
5:2