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: добавлена команда сбора данных

598   2  

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

    Ничего не найдено.