Удаление повторяющихся значений из массива PowerShell

109

Как удалить дубликаты из массива PowerShell?

$a = @(1,2,3,4,5,5,6,7,8,9,0,0)
Эрик Шуновер
источник

Ответы:

194

Используйте 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), если ваш массив уже отсортирован.
Джоуи
2
Йоханнес, Get-Unique доступен в v1 :)
Шей Леви,
2
круто, это отлично работает, просто примечание, если вы хотите быть кратким, его можно сократить даже до -u. select -uЯ бы использовал это в командной строке, но при написании кода предлагается использовать полную формулировку PS:Select-Object -Unique
papo
Это работает только с одной цифрой? Для большого списка массивов это, похоже, не работает.
EagleDev
86

Другой вариант - использовать 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
DarkLite1
источник
1
Отличный ответ. Решил мою проблему, Get-Uniqueне сработало из-за пробелов
Каньон Колоб
7
$a | sort -unique

Это работает с нечувствительностью к регистру, поэтому удаляются повторяющиеся строки с разными регистрами. Решил мою проблему.

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

$ServerList

Вышеуказанные выходы:

FS3
HQ2
Брискомо
источник
это также хорошо работает для массивов с несколькими членами
JoeRod
4

Если список отсортирован, вы можете использовать командлет Get-Unique :

 $a | Get-Unique
Мартин Брандл
источник
2
Это требует предварительной сортировки списка
Джонни Сковдал
2

С помощью моего метода вы можете полностью удалить повторяющиеся значения, оставив вам значения из массива, у которого было только количество 1. Было не ясно, действительно ли это то, что OP хотел, однако мне не удалось найти пример этого решения в Интернете, поэтому вот.

$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, все приведенные примеры находятся на отдельных массивах столбцов. Мне еще предстоит заставить это работать в массивах с несколькими столбцами, чтобы УДАЛИТЬ повторяющиеся строки, чтобы оставить отдельные вхождения строки в указанных столбцах, или разработать альтернативное решение сценария. Вместо этого эти командлеты возвращают только строки в массиве, которые произошли ОДИН РАЗ с единичным вхождением, и сбрасывают все, что имело дубликат. Обычно мне приходится вручную удалять дубликаты из окончательного вывода CSV в Excel, чтобы закончить отчет, но иногда я хотел бы продолжить работу с указанными данными в Powershell после удаления дубликатов.

Кристофер М. Рамос
источник
здесь пригодится Where-Object. Сначала вы сужаете список, используя предложение right where, затем перенаправляете его в объект sort, выбираете один или несколько столбцов для сортировки и присваиваете объекту sort -unique.
LPChip