从哈希表中删除重复的值

时间:2018-07-24 15:27:14

标签: powershell powershell-v2.0 powershell-v3.0

我是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"; } ,但是没有用。

2 个答案:

答案 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 ','}