我是powershell的新手,我需要从哈希表中删除重复的值,例如promise
具有重复的3-"c"
,而"3,4,3"
具有重复的1-"d"
"1,1,6,4"
如何获得结果?
我已经尝试过[hashtable]$alpha = @{
"a" = "1";
"b" = "2,1,5";
"c" = "3,4,3";
"d" = "1,1,6,4";
"e" = "1,7,9,0";
}
,但是没有用。
答案 0 :(得分:5)
要使用Select-Object -Unique
,您的值必须位于集合(数组)中,而不是单个字符串中。
因此,您必须首先将字符串拆分为令牌数组(-split
运算符),然后将不同的令牌重新组合为字符串(-join
运算符)。
foreach ($key in @($alpha.Keys)) {
$alpha.$key = ($alpha.$key -split ',' | Select-Object -Unique) -join ','
}
请注意@(...)
周围的$alpha.Keys
,它会有效地克隆密钥集合,这是必要的,因为否则在尝试修改集合时会出错,正在枚举,不支持。
在 PSv3 + 中,您可以改用$alpha.Keys.Clone()
,这样效率更高。
您还可以将管道与ForEach-Object
(%
) cmdlet 一起使用(而不是 expression < / em>和foreach
loop ),但对于内存中的数据结构,foreach
loop 通常更好,更快选择。
为完整起见,以下是管道解决方案(WayneA's answer的尖端技巧):
@($alpha.Keys) | ForEach-Object {
$alpha[$_] = ($alpha[$_.] -split ',' | Select-Object -Unique) -join ','
}
请注意,@(...)
周围仍然需要$alpha.Keys
,就像foreach
语句解决方案中一样。
与foreach
解决方案中一样,这会修改哈希表。
另一种选择是使用 $alpha.GetEnumerator()
,以强制PowerShell通过管道将哈希表的条目依次发送为[System.Collections.DictionaryEntry]
实例表示具有.Key
和.Value
属性的键-值对-默认情况下,PowerShell会整体输出哈希表 。
但是,必须创建一个 new 哈希表,因为您从根本上无法修改用.GetEnumerator()
枚举的集合(也隐式使用了通过foreach
循环)。
$newAlpha = @{} # initialize the new hash table
$alpha.GetEnumerator() | ForEach-Object {
$newAlpha[$_.Key] = ($alpha[$_.Key] -split ',' | Select-Object -Unique) -join ','
}
# $newAlpha now contains the updated entries.
答案 1 :(得分:2)
如前所述,这些是字符串,先将其拆分,然后再重新加入:
$NewAlpha = $Alpha.GetEnumerator() |% { $_.value = ($_.value -split "," | select -unique) -join "," ; $_}
注意:这不会保留[hashtable]类型。 为此,您将需要使用mklement0
提供的答案中提到的方法@($alpha.Keys) |% {$alpha.$_ = ($alpha.$_ -split ',' | Select-Object -Unique) -join ','}