Массив Powershell сортирует и разделяет на два разных массива
У меня есть этот массив:
[
"org-dummyemail-123-AccountName",
"org-dummyemail-123-Email",
"org-dummyemail-123-PAT",
"org-dummyemail-123-PATName",
"org-dummyemail-123-PATValidTo",
"org-dummyemail1-joemarmoto-AccountName",
"org-dummyemail1-joemarmoto-Email",
"org-dummyemail1-joemarmoto-PAT",
"org-dummyemail1-joemarmoto-PATName",
"org-dummyemail1-joemarmoto-PATValidTo"
]
И хочу разобраться и сделать два отдельных массива, как этот
[
"org-dummyemail-123-AccountName",
"org-dummyemail-123-Email",
"org-dummyemail-123-PAT",
"org-dummyemail-123-PATName",
"org-dummyemail-123-PATValidTo"
]
[
"org-dummyemail1-joemarmoto-AccountName",
"org-dummyemail1-joemarmoto-Email",
"org-dummyemail1-joemarmoto-PAT",
"org-dummyemail1-joemarmoto-PATName",
"org-dummyemail1-joemarmoto-PATValidTo"
]
Надеюсь на вашу помощь! Спасибо:)
6 ответов
Простая фильтрация массивов:
$arr="org-dummyemail-123-AccountName",
"org-dummyemail-123-Email",
"org-dummyemail-123-PAT",
"org-dummyemail-123-PATName",
"org-dummyemail-123-PATValidTo",
"org-dummyemail1-joemarmoto-AccountName",
"org-dummyemail1-joemarmoto-Email",
"org-dummyemail1-joemarmoto-PAT",
"org-dummyemail1-joemarmoto-PATName",
"org-dummyemail1-joemarmoto-PATValidTo"
$arr2 = $arr.where{$PSItem -match 'joemarmoto'}
$arr3 = $arr.where{$PSItem -notmatch 'joemarmoto'}
Несколько другой метод будет использовать Group-Object
Командлет для группировки по вычисляемому свойству. Вы не указали точную часть для сортировки - фиктивное электронное письмо или имя, которое следует за ним - поэтому я использовал часть после фиктивного электронного письма.
В результате вы получите коллекцию массивов с именем [вычисляемое свойство] и группой [элементы, соответствующие этому вычисляемому свойству]. Вы можете обращаться к ним индивидуально ИЛИ использовать их для создания новых массивов.
$AllNames = @(
'org-dummyemail-123-AccountName',
'org-dummyemail-123-Email',
'org-dummyemail-123-PAT',
'org-dummyemail-123-PATName',
'org-dummyemail-123-PATValidTo'
'org-dummyemail1-joemarmoto-AccountName',
'org-dummyemail1-joemarmoto-Email',
'org-dummyemail1-joemarmoto-PAT',
'org-dummyemail1-joemarmoto-PATName',
'org-dummyemail1-joemarmoto-PATValidTo'
)
# 3rd item index = 2
$PartToGroupOn = 2
$GroupedAllNames = $AllNames |
Group-Object -Property {$_.Split('-')[$PartToGroupOn]}
$GroupedAllNames[1].Group
выход...
org-dummyemail-123-AccountName
org-dummyemail-123-Email
org-dummyemail-123-PAT
org-dummyemail-123-PATName
org-dummyemail-123-PATValidTo
Работа с переменной $PSItem
$arr="org-dummyemail-123-AccountName",
"org-dummyemail-123-Email",
"org-dummyemail-123-PAT",
"org-dummyemail-123-PATName",
"org-dummyemail-123-PATValidTo",
"org-dummyemail1-joemarmoto-AccountName",
"org-dummyemail1-joemarmoto-Email",
"org-dummyemail1-joemarmoto-PAT",
"org-dummyemail1-joemarmoto-PATName",
"org-dummyemail1-joemarmoto-PATValidTo"
$arr2 = $arr | Where-Object {$PSItem -match 'joemarmoto'}
$arr3 = $arr | Where-Object {$PSItem -match '123'}
Посмотрите здесь: https://blogs.msdn.microsoft.com/mvpawardprogram/2013/04/15/working-with-the-new-psitem-automatic-variable-in-windows-powershell-3-0/
С этого сайта: Get-Help about_Automatic_Variables -ShowWindow
Введите "psitem" в поле "Найти", чтобы выделить весь текст, содержащий это слово:
Как мы видим, $PSItem - это то же самое, что и $_. Целью введения переменной $PSItem является облегчение чтения и понимания кода, содержащего "текущий объект в конвейере".
Ответ почти идентичен Gert Jan Kraaijeveld, но с объяснением, что делает $PSItem и откуда эта информация.
Вот версия, использующая регулярное выражение, чтобы определить, какую часть входной строки сгруппировать по:
clear-host
'REGEX 1; org-dummyemail-123 vs org-dummyemail1-joemarmoto'
$groupedByAllButLast = @(
"org-dummyemail-123-AccountName",
"org-dummyemail-123-Email",
"org-dummyemail-123-PAT",
"org-dummyemail-123-PATName",
"org-dummyemail-123-PATValidTo",
"org-dummyemail1-joemarmoto-AccountName",
"org-dummyemail1-joemarmoto-Email",
"org-dummyemail1-joemarmoto-PAT",
"org-dummyemail1-joemarmoto-PATName",
"org-dummyemail1-joemarmoto-PATValidTo"
) | Group-Object -Property @{E={$_ -replace '([^-]+-[^-]+-[^-]+)-.*', '$1'}}
for ([int]$i = 0; $i -lt $groupedByAllButLast.Count; $i++)
{
Write-Verbose $groupedByAllButLast[$i].Name -Verbose
$groupedByAllButLast[$i].Group
}
'REGEX 2; 123 vs joemarmoto'
$groupedByTheNameOrEmailBit = @(
"org-dummyemail-123-AccountName",
"org-dummyemail-123-Email",
"org-dummyemail-123-PAT",
"org-dummyemail-123-PATName",
"org-dummyemail-123-PATValidTo",
"org-dummyemail1-joemarmoto-AccountName",
"org-dummyemail1-joemarmoto-Email",
"org-dummyemail1-joemarmoto-PAT",
"org-dummyemail1-joemarmoto-PATName",
"org-dummyemail1-joemarmoto-PATValidTo"
) | Group-Object -Property @{E={$_ -replace '[^-]+-[^-]+-([^-]+)-.*', '$1'}} #all we've changed is the location of the opening bracket in this line
for ([int]$i = 0; $i -lt $groupedByTheNameOrEmailBit.Count; $i++)
{
Write-Verbose $groupedByTheNameOrEmailBit[$i].Name -Verbose
$groupedByTheNameOrEmailBit[$i].Group
}
NB: Это в основном тот же подход, что и у Ли; только вместо использования split
и, взяв сегмент signle, мы используем regex для захвата всех тех частей строки, которые имеют отношение к нашему ключу... См. MS Docs для получения дополнительной информации об этой полезной функции.
Та же идея, но с хеш-таблицей:
$json = @'
[
"org-dummyemail-123-AccountName",
"org-dummyemail-123-Email",
"org-dummyemail-123-PAT",
"org-dummyemail-123-PATName",
"org-dummyemail-123-PATValidTo",
"org-dummyemail1-joemarmoto-AccountName",
"org-dummyemail1-joemarmoto-Email",
"org-dummyemail1-joemarmoto-PAT",
"org-dummyemail1-joemarmoto-PATName",
"org-dummyemail1-joemarmoto-PATValidTo"
]
'@
$a = $json | ConvertFrom-Json
$b = @{}
$a | ForEach-Object {
$b[$_.Split('-')[0..2] -join '-'] += @($_)
}
$b | ConvertTo-Json
Обработка вашего ввода как объекта Json (из строки здесь)
- строит akey с первых 3
-
/ разделить тире детали с помощью Select-Object и
рассчитанные свойства. - Группы по этому ключу
- перестраивает объекты Json из групповых значений.
$Json = @"
[
"org-dummyemail-123-AccountName",
"org-dummyemail-123-Email",
"org-dummyemail-123-PAT",
"org-dummyemail-123-PATName",
"org-dummyemail-123-PATValidTo",
"org-dummyemail1-joemarmoto-AccountName",
"org-dummyemail1-joemarmoto-Email",
"org-dummyemail1-joemarmoto-PAT",
"org-dummyemail1-joemarmoto-PATName",
"org-dummyemail1-joemarmoto-PATValidTo"
]
"@ | ConvertFrom-JSon
$Json | Select-Object @{n='key';E={($_ -split '-')[0..2] -join '-'}},
@{n='value';e={$_}} |
Group-Object key | ForEach-Object{
$_.Group.Value | ConvertTo-Json
}
Имеет этот вывод:
[
"org-dummyemail-123-AccountName",
"org-dummyemail-123-Email",
"org-dummyemail-123-PAT",
"org-dummyemail-123-PATName",
"org-dummyemail-123-PATValidTo"
]
[
"org-dummyemail1-joemarmoto-AccountName",
"org-dummyemail1-joemarmoto-Email",
"org-dummyemail1-joemarmoto-PAT",
"org-dummyemail1-joemarmoto-PATName",
"org-dummyemail1-joemarmoto-PATValidTo"
]