我正在尝试寻找一种最有效的方法,以筛选出包含近5k个对象的大型哈希表中的所有重复项。
我正在Powershell中运行所有这些。因此,我有一个很大的哈希表,它实质上由用户名和订阅名组成
1. User_id | Sub_name
2. User_id | Sub_name
etc...
在大多数情况下,每个User_id
都有5条以上的行,因为每个新行都代表用户已订阅的订阅名称。
我需要做的是:确定每个用户的所有重复订阅。例如
1. mm1234 | sub_1
2. mm1234 | sub_4
3. mm1234 | sub_1
4. mm9999 | sub_1
5. mm9999 | sub_2
6. mm8888 | sub_1
7. mm8888 | sub_1
因此,在以上示例中,我将需要删除行3
和7
。现在,就用户在哈希中的分组方式而言,目前还没有实际的分组方法,只是将他们铲了进去。我想知道是否有可能从上述最终产品哈希中做到这一点。有什么想法吗?
答案 0 :(得分:0)
也许这会有所帮助。
如果您的大哈希看起来与此类似:
$hash = @{
'1' = @{ 'user_uuid' = 'mm1234'; 'lob' = 'subscription_1' }
'2' = @{ 'user_uuid' = 'mm5678'; 'lob' = 'subscription_1' }
'3' = @{ 'user_uuid' = 'mm1234'; 'lob' = 'subscription_2' }
'4' = @{ 'user_uuid' = 'mm5678'; 'lob' = 'subscription_5' }
'5' = @{ 'user_uuid' = 'mm1234'; 'lob' = 'subscription_3' }
'6' = @{ 'user_uuid' = 'mm1478'; 'lob' = 'subscription_1' }
}
您可以创建一个新的结果哈希,其中的键是user_uuid
,值是唯一排序的订阅数组(或称为lob
的数组)
$result = @{}
$hash.Keys | ForEach-Object {
$uid = $hash.$_.user_uuid
$value = $hash.$_.lob
if ($result.ContainsKey($uid)) {
# add to the subscriptions array for this user_uuid
$result[$uid] = ($result[$uid] + $value) | Sort-Object -Unique
}
else {
# create an element for this user_uuid and make sure the value is an array
$result[$uid] = @($value)
}
}
生成的哈希表将具有以下内容:
Name Value ---- ----- mm1234 {subscription_1, subscription_2, subscription_3} mm1478 {subscription_1} mm5678 {subscription_1, subscription_5}
如果您需要将其转换回原始$hash
的格式(哈希的哈希值),则可以执行以下操作:
# recreate the large hash using the deduped values
$newHash = @{}
$count = 1
$result.Keys | ForEach-Object {
foreach ($value in $result.$_) {
$newHash[$count++] = @{ 'user_uuid' = $_; 'lob' = $value }
}
}