В Powershell, какой лучший способ объединить две таблицы в одну?
Я новичок в 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
Есть ли лучший способ сделать это?
Ответы
Ответ 2
Через 1,5 года командлет, который я вставил в исходный ответ, претерпел столько обновлений, что полностью устарел. Поэтому я заменил код и ReadMe ссылкой на последнюю версию.
Join-Object
Командлет 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
(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
) сценарий может быть просто 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 при добавлении новых и перезаписи существующих записей
- Эффективное объединение наборов данных больших объектов, имеющих несколько совпадающих ключей