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


Ответы:


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

1
Отличный ответ. Решил мою проблему, Get-Uniqueне сработало из-за пробелов
Каньон Колоб

7
$a | sort -unique

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

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

$ServerList

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

FS3
HQ2

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.