在大型哈希的非分组部分中查找重复项的最有效方法

时间:2019-04-10 18:05:02

标签: powershell loops hash duplicates

我正在尝试寻找一种最有效的方法,以筛选出包含近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

因此,在以上示例中,我将需要删除行37。现在,就用户在哈希中的分组方式而言,目前还没有实际的分组方法,只是将他们铲了进去。我想知道是否有可能从上述最终产品哈希中做到这一点。有什么想法吗?

1 个答案:

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