Powershell подсчитывает группы элементов на основе подстроки
У меня есть массив данных, собранный из команды, которая содержит несколько элементов. Элемент имени каждого элемента начинается с трех или четырех символов, за которыми следует дефис. Я хотел бы получить количество всех элементов в массиве, который содержит один и тот же идентификатор.
Данные, собранные с помощью следующей команды PowerCLI (VMware):
$items = Get-Datastore <Datastore Name> | Get-VM
Пример данных:
NAME STATUS INFO DETAIL
ABC-1234-XXXX PoweredOn Info Detail
ABC-1235-XXXX PoweredOn Info Detail
ABC-1236-XXXX PoweredOn Info Detail
BCA-1234-XXXX PoweredOn Info Detail
BCA-1235-XXXX PoweredOn Info Detail
CBA-1234-XXXX PoweredOn Info Detail
CBA-1235-XXXX PoweredOn Info Detail
CBA-1236-XXXX PoweredOn Info Detail
CBA-1237-XXXX PoweredOn Info Detail
Я бы хотел, чтобы сценарий дал мне что-то вроде следующего:
NAME COUNT
ABC 3
BCA 2
CBA 4
У меня действительно нет пример кода, но я рассматривал использование метода PowerShell "group"в сочетании с методом count. Я борюсь с тем, как объединить все в нечто полезное.
Группа:
$array = $items | Group Name
Количество:
$array.count
EDIT: добавлена команда сбора данных
2 ответов:
Вы близки, но вы не хотите группировать по полному имени - вы хотите разделить
nameна - и взять только первый элемент [0].Это можно сделать
on the flyвнутри {скриптового блока} как вычисляемое свойство. Здесь группа-это желаемый результат, в других случаях (сортировка по несуществующему свойству) она не оставляет следов в существующих данных.Это показывает пошаговое преобразование вашего данные:
$items = Get-Datastore <Datastore Name> | Get-VM $Items
NAME STATUS INFO DETAIL ---- ------ ---- ------ ABC-1234-XXXX PoweredOn Info Detail ABC-1235-XXXX PoweredOn Info Detail ABC-1236-XXXX PoweredOn Info Detail BCA-1234-XXXX PoweredOn Info Detail BCA-1235-XXXX PoweredOn Info Detail CBA-1234-XXXX PoweredOn Info Detail CBA-1234-XXXX PoweredOn Info Detail CBA-1234-XXXX PoweredOn Info Detail CBA-1234-XXXX PoweredOn Info Detail
$Items | Group-Object {$_.Name.Split('-')[0]}
Count Name Group ----- ---- ----- 3 ABC {@{NAME=ABC-1234-XXXX; STATUS=PoweredOn; INFO=Info; DETAIL=Detail}, ... 2 BCA {@{NAME=BCA-1234-XXXX; STATUS=PoweredOn; INFO=Info; DETAIL=Detail}, ... 4 CBA {@{NAME=CBA-1234-XXXX; STATUS=PoweredOn; INFO=Info; DETAIL=Detail}, ...
$Items | Group-Object {$_.Name.Split('-')[0]} | Select-Object Name,Count
Name Count ---- ----- ABC 3 BCA 2 CBA 4Редактирование с помощью Group-Object-NoElement оставило бы только изменение порядка для последнего шага
Если Ваш массив элементов называется
$items, а столбец -Name, то это должно сработать.
$items | %{($_.Name -split "-")[0]} | group | select Name,CountДеконструированный, вы передаете элементы в
ForEach-Object, где вы разбиваете$_.Nameна символ-, берете первый элемент и передаете его вGroup-Object, затем выбираете свойстваNameиCount.
Comments