Видалення повторюваних значень з масиву PowerShell


Відповіді:


193

Використовувати Select-Object(чий псевдонім є select) з -Uniqueперемикачем; наприклад:

$a = @(1,2,3,4,5,5,6,7,8,9,0,0)
$a = $a | select -Unique

9
Це було занадто просто :-(. У PowerShell 2 ви також можете використовувати Get-Unique(або gu), якщо ваш масив уже відсортований.
Joey

2
Йоханнес, Get-Unique доступний у версії :)
Шей Леві

2
класно, це працює чудово, просто Примітка, якщо ви хочете бути стислими, його можна було б скоротити навіть до -u. select -uЯ використовував би це в командному рядку, але написаний у коді, пропонується використовувати повне формулювання PS:Select-Object -Unique
papo

Це працює лише з однозначною? Для великого списку масивів він, здається, не працює.
EagleDev

85

Іншим варіантом є використання Sort-Object(псевдонім якого є sort, але тільки в Windows) з
-Uniqueкомутатором, який поєднує сортування з видаленням дублікатів:

$a | sort -unique

2
Це також вирішує мою наступну проблему, яку я сортую. Дякую!
Зареєстрований користувач

2
Цей також виглядає крихітно трохи швидше.
Gneo Pompeo

7

У випадку, якщо ви хочете повністю довести бомбу, це я порадив би:

@('Apples', 'Apples ', 'APPLES', 'Banana') | 
    Sort-Object -Property @{Expression={$_.Trim()}} -Unique

Вихід:

Apples
Banana

При цьому використовується Propertyпараметр спочатку Trim()рядків, тому додаткові пробіли видаляються, а потім вибираються лише -Uniqueзначення.

Більше інформації про Sort-Object:

Get-Help Sort-Object -ShowWindow

1
Дивовижна відповідь. Вирішив мою проблему, Get-Uniqueне працював, тому що пробіли
Колобський каньйон

7
$a | sort -unique

Це працює з нечутливою до регістру, тому видаляє дублікати рядків із різними регістрами. Вирішив мою проблему.

$ServerList = @(
    "FS3",
    "HQ2",
    "hq2"
) | sort -Unique

$ServerList

Вищевказані результати:

FS3
HQ2

це також добре працює для масивів з кількома членами
JoeRod


2

За допомогою мого методу ви можете повністю видалити повторювані значення, залишаючи вам значення з масиву, який налічував лише 1. Незрозуміло, чи справді цього хотіла ОП, проте я не зміг знайти приклад цього рішення в Інтернеті, так що ось.

$array=@'
Bananna
Apple
Carrot
Pear
Apricot
Pear
Bananna
'@ -split '\r\n'

($array | Group-Object -NoElement | ?{$_.count -eq 1}).Name

2

Незалежно від того SORT -UNIQUE, SELECT -UNIQUEчи використовуєте ви , або GET-UNIQUEвід Powershell 2.0 до 5.1, усі наведені приклади є на масивах одного стовпця. Мені ще потрібно, щоб це функціонувало через масиви з декількома стовпцями, щоб ВИДАЛИТИ повторюваних рядків, щоб залишити поодинокі зустрічі рядка через зазначені стовпці або розробити альтернативне рішення сценарію. Натомість ці командлети повернули лише рядки у масиві, який відбувся ONCE з особливим виникненням та скинув усе, що мав дублікат. Зазвичай мені доводиться видаляти дублікати вручну з остаточного виводу CSV в Excel, щоб закінчити звіт, але іноді я хотів би продовжувати роботу із зазначеними даними в Powershell після видалення дублікатів.


саме тут стане в нагоді «Де-об’єкт». Ви спочатку звужуєте список за допомогою пункту праворуч де, а потім передаєте його до об'єкта сортування, вибираєте один або декілька стовпців для сортування та надаєте об'єкту сортування -уніке.
LPChip
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.