PowerShell dizisinden yinelenen değerleri kaldırma


Yanıtlar:


193

Anahtarla Select-Object(kimin takma adıdır select) kullanın -Unique; Örneğin:

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

9
Bu çok kolaydı :-(. PowerShell 2'de diziniz zaten sıralanmışsa Get-Unique(veya gu) öğesini de kullanabilirsiniz .
Joey

2
Johannes, Get-Unique v1'de mevcut :)
Shay Levy

2
harika, bu iyi çalışıyor, sadece bir Not, özlü olmak istiyorsanız, kısaltılabilir bile -u. select -uBunu bir komut satırında kullanırdım, ancak bir kodla yazılırsa, tam PS ifadesini kullanmanız önerilir:Select-Object -Unique
papo

Bu sadece tek rakamla mı çalışıyor? Geniş bir dizi listesi için işe yaramıyor gibi görünüyor.
EagleDev

86

Diğer bir seçenek de Sort-Object(takma adı sortyalnızca Windows'ta olan)
-Uniqueanahtarla birlikte kullanmaktır; bu anahtar, sıralamayı yinelenenlerin kaldırılmasıyla birleştirir:

$a | sort -unique

2
Bu aynı zamanda bir sonraki problemimi de çözüyor, bu da onu nasıl sıralayacağım. Teşekkürler!
Kayıtlı Kullanıcı

2
Bu da biraz daha hızlı görünüyor.
Gneo Pompeo

7

Tamamen bomba ispat etmek istemeniz durumunda, tavsiye edeceğim şey bu:

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

Çıktı:

Apples
Banana

Bu, Propertyönce Trim()dizeleri kullanmak için parametreyi kullanır , böylece fazladan boşluklar kaldırılır ve sonra yalnızca -Uniquedeğerleri seçer .

Daha fazla bilgi Sort-Object:

Get-Help Sort-Object -ShowWindow

1
Harika cevap. Sorunumu çözdüm, Get-Uniqueişe yaramadı çünkü boşluklar
Kolob Canyon

7
$a | sort -unique

Bu, büyük / küçük harfe duyarlı değildir, bu nedenle farklı durumlara sahip yinelenen dizeleri kaldırır. Sorunumu çözdüm.

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

$ServerList

Yukarıdaki çıktılar:

FS3
HQ2

Bu aynı zamanda birden fazla üye ile diziler için iyi çalışır
JoeRod


2

Yöntemimle, yinelenen değerleri tamamen kaldırabilir ve sizi diziden yalnızca 1 sayıya sahip değerlerle bırakabilirsiniz. OP'nin gerçekte istediği şeyin bu olup olmadığı açık değildi, ancak bu çözümün bir örneğini çevrimiçi olarak bulamadım bu yüzden işte burada.

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

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

2

Hangisini kullanıyor olursanız olun SORT -UNIQUE, SELECT -UNIQUEya GET-UNIQUEPowershell 2.0 ila 5.1, verilen tüm örnekler tek sütun diziler vardır. Bunu, söz konusu Sütunlar arasında bir Satırın tek bir oluşumunu bırakmak veya alternatif bir komut dosyası çözümü geliştirmek için Yinelenen Satırları KALDIRMAK için birden fazla Sütunlu Diziler arasında işlev görmesi için henüz almadım . Bunun yerine, bu cmdlet'ler yalnızca tek bir oluşumla bir KEZ meydana gelen ve yinelenen her şeyi atan bir Dizideki Satırları döndürdü. Genellikle raporu bitirmek için Excel'deki son CSV çıktısından Yinelemeleri manuel olarak Kaldırmam gerekir, ancak bazen yinelenenleri kaldırdıktan sonra Powershell içinde söz konusu verilerle çalışmaya devam etmek isterim.


Bu, Where-Object'in işe yaradığı yerdir. Önce right where cümlesini kullanarak listeyi daraltın, ardından onu bir sıralama nesnesine yönlendirin, sıralamak için bir veya daha fazla sütun seçin ve sıralama nesnesine bir benzersiz verin.
LPChip
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.