Найти среднее значение одного свойства из объекта, сгруппированного по другому свойству - PullRequest
0 голосов
/ 21 октября 2019

Ниже мой CSV-файл с данными

SummaryMonth    OSType  AVERAGE_of_Availability
10/7/2019 10:30 Unix    100
10/7/2019 10:30 Network 99.95039683
10/7/2019 10:30 Unix    100
10/7/2019 10:30 Unix    99.8015873
10/7/2019 10:30 Network 100
10/7/2019 10:30 Network 100
10/7/2019 10:30 Windows 99.95037221
10/7/2019 10:30 Network 100
10/7/2019 10:30 Unix    100
10/7/2019 10:30 Windows 100
10/7/2019 10:30 storage 100

Я использовал Group-Object и сгруппировал данные на основе OSType

Count Name                      Group                                                                                                                           
----- ----                      -----                                                                                                                           
1720 Unix                      {@{SummaryMonth=10/7/2019 10:30:00 AM; DNSName=; OSType=Unix; NodeName=test01.test.local; IP_Address=xx.xx.xx.xx; AVERAG...
297 Network                   {@{SummaryMonth=10/7/2019 10:30:00 AM; DNSName=; OSType=Network; NodeName=TEST; IP_Address=xx.xx.xx.xx; AVERAGE_of_Ava...
799 Windows                   {@{SummaryMonth=10/7/2019 10:30:00 AM; DNSName=; OSType=Windows; NodeName=test; IP_Address=xx.xx.xx.xx; AVERAGE_of_Av...
39 storage                   {@{SummaryMonth=10/7/2019 10:30:00 AM; DNSName=test.com; OSType=storage; NodeName=test...

Я получил вывод каквыше.

Мне нужно найти среднее значение AVERAGE_of_Availability для каждого типа ОС из этого.

Например, для Unix число 1720, поэтому сумма всех 1720 записей, а затем найтисредний.

Ответы [ 2 ]

1 голос
/ 21 октября 2019

Вот один из способов сделать это:

Import-Csv .\data.csv |
    Group-Object OSType |
        ForEach-Object {
            [PsCustomObject]@{
                OSType        = $_.Name
                AverageUptime = ($_.Group | Measure-Object -Property AVERAGE_of_Availability -Average).Average
            }
        }

Предполагается, что CSV фактически разделен запятыми. Если это не так (как выглядит случай), то вы можете попробовать использовать параметр -Delimiter, равный Import-Csv, или предварительно обработать файл, чтобы облегчить работу с ним.

1 голос
/ 21 октября 2019

Используйте Measure-Object -Average как это:

# Constructing test data
# In your case you probably use Import-CSV instead
# If Import-CSV was used, no need to use ConvertFrom-CSV
$data = @"
SummaryMonth;OSType;AVERAGE_of_Availability
10/7/2019 10:30;Unix;100
10/7/2019 10:30;Network;99.95039683
10/7/2019 10:30;Unix;100
10/7/2019 10:30;Unix;99.8015873
10/7/2019 10:30;Network;100
10/7/2019 10:30;Network;100
10/7/2019 10:30;Windows;99.95037221
10/7/2019 10:30;Network;100
10/7/2019 10:30;Unix;100
10/7/2019 10:30;Windows;100
10/7/2019 10:30;storage;100
"@ | ConvertFrom-CSV -Delimiter ';'

# Grouping data
$grouppedData = $data | Group-Object OSType

# Getting desired data
$result = $grouppedData | Select-Object Name,@{name="Avg";e={($_.Group.AVERAGE_of_Availability | Measure-Object -Average).Average}}

# Output the result
$result

Вывод будет:

Name              Avg
----              ---
Unix     99.950396825
Network 99.9875992075
Windows  99.975186105
storage           100

Объяснение:

В вашем Select-Object Вы должны использовать вычисленное свойство, чтобы построить желаемое значение в (в вашем случае среднее значение AVERAGE_of_Availability). Поскольку Measure-Object возвращает значение в формате, подобном

Count    : 1
Average  : 100
Sum      :
Maximum  :
Minimum  :
Property :

, вам необходимо получить доступ только к свойству Average этого объекта. Вы можете сделать это с помощью точечного обозначения: ($object | Measure-Object -Average).Average. В вашем случае вместо $object вы помещаете массив AVERAGE_of_Availability значений для правильных OSType.

Ссылки:

Подробнее о вычисляемом свойстве (только один пример статьи) можнонайдено здесь .

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