Каков наилучший способ объединить две таблицы в одну в Powershell?
-
13-09-2019 - |
Вопрос
Я довольно новичок в Powershell, и мне интересно, знает ли кто-нибудь какой-нибудь лучший способ решить проблему в следующем примере.
У меня есть массив сопоставлений от IP-адреса до имени хоста.Это представляет собой список активных договоров аренды DHCP:
PS H:\> $leases
IP Name
-- ----
192.168.1.1 Apple
192.168.1.2 Pear
192.168.1.3 Banana
192.168.1.99 FishyPC
У меня есть еще один массив сопоставлений MAC-адреса с IP-адресом.Это представляет собой список резервирований IP-адресов:
PS H:\> $reservations
IP MAC
-- ---
192.168.1.1 001D606839C2
192.168.1.2 00E018782BE1
192.168.1.3 0022192AF09C
192.168.1.4 0013D4352A0D
Для удобства я смог создать третий массив сопоставлений из MAC-адреса в IP-адрес и имя хоста, используя следующий код.Идея заключается в том, что $reservations
должно появиться третье поле, "Имя", которое заполняется всякий раз, когда есть соответствующее поле "IP":
$reservations = $reservations | foreach {
$res = $_
$match = $leases | where {$_.IP -eq $res.IP} | select -unique
if ($match -ne $NULL) {
"" | select @{n="IP";e={$res.IP}}, @{n="MAC";e={$res.MAC}}, @{n="Name";e={$match.Name}}
}
}
Желаемый результат выглядит примерно так:
PS H:\> $ideal
IP MAC Name
-- --- ----
192.168.1.1 001D606839C2 Apple
192.168.1.2 00E018782BE1 Pear
192.168.1.3 0022192AF09C Banana
192.168.1.4 0013D4352A0D
Есть ли какой-нибудь лучший способ сделать это?
Решение
Ли Холмс написал запись в блоге о функции объединения объектов это делает то, что ты хочешь.Жаль, что это еще не встроено в PowerShell.
Другие советы
По прошествии 1,5 лет командлет, который я вставил в исходный ответ, претерпел столько обновлений, что полностью устарел.Поэтому я заменил код и тот Прочитай меня со ссылкой на последнюю версию.
Присоединиться-Объект
Командлет Join-Object можно загрузить из галереи PowerShell с помощью команды:
Install-Script -Name Join
В Join
пакет включает в себя Join-Object
(псевдоним Join
) команда и следующие прокси - команды:
InnerJoin-Object
, псевдонимInnerJoin
(Join-Object -JoinType Inner
)
Возвращает только соединенные объектыLeftJoin-Object
, псевдонимLeftJoin
(Join-Object -JoinType Left
)
Возвращает соединенные объекты и остальные оставленные объектыRightJoin-Object
, псевдонимRightJoin
(Join-Object -JoinType Right
)
Возвращает соединенные объекты и остальные нужные объектыFullJoin-Object
, псевдонимFullJoin
(Join-Object -JoinType Full
)
Возвращает соединенные объекты и остальные левые и правые объектыCrossJoin-Object
, псевдонимCrossJoin
(Join-Object -JoinType Cross
)
Соединяет каждый левый объект с каждым правым объектомUpdate-Object
, псевдонимUpdate
(Join-Object -JoinType Left -Merge = {RightOrLeft.$_}
)
Обновляет левый объект свойствами правого объектаMerge-Object
, псевдонимMerge
(Join-Object -JoinType Full -Merge = RightOrLeft.$_}
)
Обновляет левый объект свойствами правого объекта и вставляет справа, если значения соответствующего свойства не равны.
Прочитай меня
Полный ReadMe (и исходный код) доступен на GitHub: https://github.com/iRon7/Join-Object
Установка
После загрузки (Install-Script -Name Join
), скрипт может быть просто вызван с помощью точечный поиск:
. .\Join.ps1
Вы также можете рассмотреть возможность преобразования скрипта в модуль PowerShell, переименовав его в модуль PowerShell (.psm1
) файл и перемещение его в одну из папок модуля, определенных в $env:PSModulePath
.Для получения более подробной информации смотрите: Как написать модуль сценария PowerShell.
Примечание: в Import-Module
команда требуется для загрузки прокси-команд.
Ответ
Чтобы ответить на фактический пример в вопросе:
$reservations | LeftJoin $leases -On IP
IP MAC Name
-- --- ----
192.168.1.1 001D606839C2 Apple
192.168.1.2 00E018782BE1 Pear
192.168.1.3 0022192AF09C Banana
192.168.1.4 0013D4352A0D
Примеры
Дополнительные примеры можно найти в соответствующих вопросах Stackoverflow по адресу:
- Объединение нескольких CSV-файлов
- Объедините два CSV-файла - добавьте CSV в качестве другого столбца
- Команда CMD или Powershell для объединения соответствующих строк из двух файлов
- Могу ли я использовать SQL-команды (такие как join) для объектов в powershell без участия какого-либо SQL-сервера / базы данных?
- Команда CMD или Powershell для объединения соответствующих строк из двух файлов
- Сравните два CSV-файла, сопоставьте столбцы в 2 или более столбцах, экспортируйте определенные столбцы из обоих CSV-файлов с помощью powershell
- Объедините два CSV-файла при добавлении новых и перезаписи существующих записей
- Объединение двух CSV с последующим переупорядочением столбцов на выходе
- Объедините два CSV-файла при добавлении новых и перезаписи существующих записей
- Эффективное объединение больших наборов данных объектов, имеющих несколько совпадающих ключей