Объединение двух хеш-таблиц и получение общих значений путем группировки в Powershell - PullRequest
2 голосов
/ 26 апреля 2020

Мне нужно объединить две хеш-таблицы в один PSCustomObject или другую хеш-таблицу (не имеет значения), и я хотел сгруппировать вывод, как показано ниже.

1) Сначала я хотел найти ключи из Hashtable1 в hashtable2 для получения значений.

2) Сгруппируйте значения в hashtable1 и отобразите количество уникальных ключей. Я смог выполнить это с помощью приведенных ниже командлетов, но мне не удалось добиться успеха с другими двумя целями.

$uniquevalues = @{}
$hastable1.Values | Sort | % { $uniquevalues["$_"] += 1 }

3) Суммируйте значения из hashtable2, сгруппированные по ключу.

$hastable1
E737A146 -4                                                                                                                                  
F637A146 14                                                                                                                                  
E637A146 10                                                                                                                                  
E537A146 -4                                                                                                                                  

$hastable2
E737A146 1                                                                                                                                   
F637A146 7                                                                                                                                   
E637A146 2                                                                                                                                   
E537A146 1 

Expected Output:
unique_Values_From_HashTable1 || Count_unique_keys_HashTable1 || Sum_Values_Hashtable2_ByKey&ByValuesFrom Hashatable1
-4 2 2
14 1 7
10 1 2

1 Ответ

1 голос
/ 27 апреля 2020

Добро пожаловать на SO. Вот одно из возможных решений, хотя я подозреваю, что может быть более эффективный метод, позволяющий избежать вложенных циклов:

$hashtable1 = @{
    E737A146=-4
    F637A146=14
    E637A146=10
    E537A146=-4
}

$hashtable2=@{
    E737A146=1
    F637A146=7
    E637A146=2
    E537A146=1
}

# 2) Group the values within hashtable1 and display count of unique keys.
$uniquevalues = @{}
$hastable1.Values | Sort | % { $uniquevalues["$_"] += 1 }

# 3) Sum up the values from hashtable2 grouped by key.
$results = @{}
foreach ($uVal in $uniquevalues.Keys) {
    foreach ($item1 in $hashtable1.Keys) {
        if ($uVal -eq "$($hashtable1[$item1])") {
            foreach ($item2 in $hashtable2.Keys) {
                if ($item1 -eq $item2) {
                    $results[$uVal] = [ordered]@{
                        unique_Values_From_HashTable1 = $uVal
                        Count_unique_keys_HashTable1 = $uniquevalues[$uVal]
                        Sum_Values_Hashtable2_ByKey = $results[$uVal].Sum_Values_Hashtable2_ByKey + $hashtable2[$item2]
                    }
                }
            }
        }
    }
}

($results.Values | Select-Object -Property Keys -Unique).Keys -join ' || '
foreach ($k in $results.Keys) {
    "{0} {1} {2}" -f 
        $results[$k].unique_Values_From_HashTable1, 
        $results[$k].Count_unique_keys_HashTable1, 
        $results[$k].Sum_Values_Hashtable2_ByKey
}

Вывод:

unique_Values_From_HashTable1 || Count_unique_keys_HashTable1 || Sum_Values_Hashtable2_ByKey
-4 2 2
10 1 2
14 1 7

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...