[英]How to group arrays in Powershell?
使用 PowerShell 转换数组的简单有效的方法是什么? 初始数组有两个属性Number
和Color
。
Number Color 1 Red 2 Red 3 Red 4 Red 5 Blue 6 Blue 7 Green 8 Green 9 Green
output 阵列应如下所示:
Color Number Red 1,2,3,4 Blue 5,6 Green 7,8,9
# Input objects.
$objects = @'
Number,Color
1,Red
2,Red
3,Red
4,Red
5,Blue
6,Blue
7,Green
8,Green
9,Green
'@ | ConvertFrom-Csv
$objects |
Group-Object Color |
Select-Object @{ n='Color'; e='Name'}, @{ n='Number'; e={ $_.Group.Number } }
上述产量:
Color Number
----- ------
Blue {5, 6}
Green {7, 8, 9}
Red {1, 2, 3, 4}
注意:由于Group-Object
的工作方式, Color
值在 output 中按字母顺序排序。
也可以看看:
使用Group-Object
添加@mklement0 的出色答案,我们还可以通过添加-AsHashTable
开关将项目分组到System.Collections.Hashtable
中。 要迭代哈希表键和值,我们必须使用System.Collections.Hashtable.GetEnumerator
。
$objects = @'
Number,Color
1,Red
2,Red
3,Red
4,Red
5,Blue
6,Blue
7,Green
8,Green
9,Green
'@ | ConvertFrom-Csv
$ht = $objects | Group-Object -Property Color -AsHashTable
$ht.GetEnumerator() |
Select-Object @{Name="Color";Expression={$_.Key}}, @{Name="Number";Expression={$_.Value | Select-Object -ExpandProperty Number}}
Output:
Color Number
----- ------
Green {7, 8, 9}
Red {1, 2, 3, 4}
Blue {5, 6}
如果我们想按Number
对结果进行排序,我们可以使用Sort-Object
按第一个数字排序:
$ht.GetEnumerator() |
Select-Object @{Name="Color";Expression={$_.Key}}, @{Name="Number";Expression={$_.Value | Select-Object -ExpandProperty Number}} |
Sort-Object @{Expression={$_.Number[0]}}
或者使用System.Collections.Specialized.OrderedDictionary
创建 arrays 的有序哈希表并维护密钥插入的顺序:
$ht = [ordered]@{}
foreach ($object in $objects) {
if (-not ($ht.Keys -contains $object.Color)) {
$ht[$object.Color] = @()
}
$ht[$object.Color] += $object.Number
}
$ht.GetEnumerator() |
Select-Object @{Name="Color";Expression={$_.Key}}, @{Name="Number";Expression={$_.Value}}
其中将output如下:
Color Number
----- ------
Red {1, 2, 3, 4}
Blue {5, 6}
Green {7, 8, 9}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.