如果我有一个数组:
1 1 1 2 2 3 4 4 4 4 5 5
如何使用 Powershell 告诉我该数组中有多少个元素?
为了更清楚一点,我应该为每个数组元素单独计数:
元素:计数
1:3
2:2
3:1
4:4
5:2
如果我有一个数组:
1 1 1 2 2 3 4 4 4 4 5 5
如何使用 Powershell 告诉我该数组中有多少个元素?
为了更清楚一点,我应该为每个数组元素单独计数:
元素:计数
1:3
2:2
3:1
4:4
5:2
您可以使用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}
如果你想要一个项目及其计数的哈希表,你只需要ForEach-Object
在它后面一点:
$array | group | % { $h = @{} } { $h[$_.Name] = $_.Count } { $h }
您可以根据需要调整输出和格式化:
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
Joey 的有用答案提供了关键指针:使用Group-Object
cmdlet按相等对输入对象进行分组。
(要按一个或多个属性值对它们进行分组,请使用-Property
)。
Group-Object
输出[Microsoft.PowerShell.Commands.GroupInfo]
对象,每个对象代表一组相等的输入对象,其显着属性是:
.Values
...定义组的值,作为一个实例(在手头的情况下[System.Collections.ArrayList]
只有1 个元素,因为输入对象作为一个整体用于形成组)。
.Count
...该组中的对象数。
如果在这种情况下,不需要将单个组成员收集为每个组的一部分,-NoElement
则可以用于提高效率。
您可以根据需要自由地进一步处理组对象;要获得问题中规定的特定输出格式,您可以使用Select-Object
计算属性。
把它们放在一起:
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