Выбор отличительных элементов в массиве с помощью PowerShell и Linq - PullRequest
0 голосов
/ 02 июня 2019

Я уже несколько часов бьюсь головой об этой проблеме.

У меня есть многомерный массив, и мне нужно выбрать уникальные элементы на основе двух «столбцов».

Существует ли эффективный .Net или другой способ сделать это и достичь желаемого результата?

Данные выглядят примерно так:

ComputerName, IP-адрес, Mac-адрес, FirstObserved

Я хотел бы определить уникальные значения на основе MacAddress и ComputerName и сохранить уникальное значение на основе самой старой даты FirstObserved.

Я пробовал способы PowerShell сделать это, но, по меньшей мере, он ужасно медленный.

$data | Group-Object -Property ComputerName,MacAddress | ForEach-Object{$_.Group | Sort-Object -Property FirstObserved | Select-Object -First 1}

В идеальном мире у меня был бы список предметов без дубликатов с самой старой записью, основанной на дате FirstObserved.

1 Ответ

2 голосов
/ 02 июня 2019

Вы можете реализовать группировку вручную с помощью хеш-таблицы:

$FirstObserved = @{}
Import-Csv .\data.csv |ForEach-Object {
    $key  = $_.Computername,$_.MacAddress -join ','
    $date = $_.FirstObserved -as [datetime]

    # Check if we already have an entry for this Name + MAC combo
    if($FirstObserved.Contains($key))
    {
        # Make sure the current date is older than what we have already
        if($FirstObserved[$key] -gt $date)
        {
            $FirstObserved[$key] = $date
        }
    }
    else
    {
        # First instance of the Name + MAC combo, save the date
        $FirstObserved[$key] = $date
    }
}

Теперь вы можете легко найти первое свидание для комбинации с:

$FirstObserved["Computer-01,11:22:33:44:55:66"]

Если вы хотите экспортировать список в другой файл CSV, все, что вам нужно сделать, это превратить пары ключ-значение хеш-таблицы в объекты:

$FirstObserved |Select-Object @{Name='Identity';Expression={$_.Key}},@{Name='FirstObserved';Expression={$_.Value}} |Export-Csv -Path output.csv
...