Powershell подсчитывает группы элементов на основе подстроки - PullRequest
0 голосов
/ 08 мая 2018

У меня есть массив данных, собранных из команды, которая содержит несколько элементов. Элемент имени каждого элемента начинается с трех-четырехзначного идентификатора, за которым следует дефис. Я хотел бы получить количество всех элементов в массиве, который содержит один и тот же идентификатор.

Данные, собранные с помощью следующей команды 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

РЕДАКТИРОВАТЬ: Добавлена ​​команда сбора данных

Ответы [ 2 ]

0 голосов
/ 09 мая 2018

Вы близки, но не хотите группировать по полному имени - вы хотите разделить name at - и взять только первый элемент [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 оставило бы только переупорядочениеза последний шаг

0 голосов
/ 09 мая 2018

Если ваш массив элементов называется $items, а столбец - Name, тогда это должно работать.

$items | %{($_.Name -split "-")[0]} | group | select Name,Count

Деконструированный, вы отправляете элементы в ForEach-Object, где вы разделяете $_.Name на символ -, берете первый элемент и передаете его в Group-Object, затем выбираете Name и Count свойства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...