Объединить значение массива 2 на основе имени сервера

#powershell

#powershell

Вопрос:

Ниже приведены 2 таблицы, которые у меня есть, которые я получил из запроса

Таблица -1

 Servername              Type max avg
lnx0401.ch3.prod.i.com  AS  100 40
lnx0402.ch3.prod.i.com  AS  99  30
lnx0576.ch3.prod.i.com  AS  34  3
lnx0577.ch3.prod.i.com  AS  94  8
lnx0578.ch3.prod.i.com  AS  99  21
  

Таблица -2

 Servername              Type Count
lnx0401.ch3.prod.i.com  AS  86
lnx0402.ch3.prod.i.com  AS  42
  

Вывод должен быть следующим

 Servername             Type max avg count
lnx0401.ch3.prod.i.com  AS  100 40 86
lnx0402.ch3.prod.i.com  AS  99  30 42
lnx0576.ch3.prod.i.com  AS  34  3  0
lnx0577.ch3.prod.i.com  AS  94  8  0
lnx0578.ch3.prod.i.com  AS  99  21 0
  

необходимо сопоставить данные таблицы -2 с таблицей -1, и если сервер присутствует в таблице — 1, необходимо выбрать счетчик из таблицы -2 и создать итоговую таблицу, иначе против count будет указано 0.

Пожалуйста, дайте мне знать, как это сделать

пробовал, но запутался

 $hashB=@{}
foreach($records in $data_2)
{
    $hashB[$records.servername] = $records
}

$data_1 | foreach{
    
    $record = $_
    $other = $hashB[$record.servername]

    [pscustomobject]@{ServerName=$_.servername
                 RoleType=$_.RoleType
                 CPUMax = $_.cpumax
                 CPUAvg = $_.cpuavg
                 PeakCount = $other.peakcount}
}

  

Ответ №1:

Вы можете сделать это без установки какого-либо модуля с

 $table3 = $table1 | ForEach-Object  {
    $server = $_.Servername
    $_ | Select-Object *, @{Name = 'Count'; Expression = {[int]($table2 | Where-Object {$_.Servername -eq $server}).Count}}
}

# output on screen
$table3 | Format-Table -AutoSize

# output to CSV
$table3 | Export-Csv -Path 'table3.csv' -NoTypeInformation
  

Вывод на экран

 Servername             Type max avg Count
----------             ---- --- --- -----
lnx0401.ch3.prod.i.com AS   100 40  86   
lnx0402.ch3.prod.i.com AS   99  30  42   
lnx0576.ch3.prod.i.com AS   34  3   0    
lnx0577.ch3.prod.i.com AS   94  8   0    
lnx0578.ch3.prod.i.com AS   99  21  0  
  

Комментарии:

1. Спасибо за ваш ответ. точно ищу это, но одна небольшая проблема. на выходе вместо Count =0 оно становится пустым.

2. @EmptyCoder Вы можете привести результат в выражении к [int] . Это приведет к тому, что a 0 будет пустым. (отредактировано в коде). Какую версию PowerShell вы используете?

3. сработало точно. еще раз спасибо.использование powershell 5.1.14409.1018

Ответ №2:

используйте модуль join-object, это позволит объединить 2 массива без каких-либо циклов. В примере, который я использую csv из импорта, вам не нужно, вы можете просто использовать массивы. Пример

Установка-Объединение модуля-объект

$test = Импорт-Csv C:Temptest1.csv
$test2 = Импорт-Csv C:Temptest2.csv

Join-Object -Left $test -LeftJoinProperty Имя_сервера -Справа $test2 -RightJoinProperty имя_сервера -количество правых свойств

https://www.powershellgallery.com/packages/Join-Object/2.0.1