使用Powershell,我如何计算数组中每个元素的出现次数?

spe*_*der 13 arrays powershell scripting

如果我有一个数组:

1 1 1 2 2 3 4 4 4 4 5 5

如何使用Powershell告诉我该阵列中每个元素有多少?

为了更清楚一点,我应该为每个数组元素分别计算:

元素:计数

1:3

2:2

3:1

4:4

5:2

Joe*_*oey 26

您可以使用Group-Objectcmdlet:

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}
Run Code Online (Sandbox Code Playgroud)

如果你想要一个项目及其计数的哈希表,你只需要一点点ForEach-Object:

$array | group | % { $h = @{} } { $h[$_.Name] = $_.Count } { $h }
Run Code Online (Sandbox Code Playgroud)


Sha*_*evy 7

您可以根据需要调整输出和格式:

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
Run Code Online (Sandbox Code Playgroud)

  • 不过,他们想要计数。因此 `-AsHashTable` 没有什么帮助。 (3认同)
  • `$ht['#'].count`,在 `System.Collections.Hashtable` 中包含一个名为 `count` 的方法 (2认同)

mkl*_*nt0 7

Joey 的有用答案提供了关键的指针:使用Group-Objectcmdlet按相等性对输入对象进行分组。(要按一个或多个属性值
对 它们进行分组,请使用)。-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
Run Code Online (Sandbox Code Playgroud)