Menghapus nilai duplikat dari array PowerShell

109

Bagaimana cara menghapus duplikat dari array PowerShell?

$a = @(1,2,3,4,5,5,6,7,8,9,0,0)
Eric Schoonover
sumber

Jawaban:

193

Gunakan Select-Object(alias siapa select) dengan -Uniquesakelar; misalnya:

$a = @(1,2,3,4,5,5,6,7,8,9,0,0)
$a = $a | select -Unique
Keith Hill
sumber
9
Itu terlalu mudah :-(. Di PowerShell 2 Anda juga dapat menggunakan Get-Unique(atau gu) jika array Anda sudah diurutkan.
Joey
2
Johannes, Get-Unique tersedia di v1 :)
Shay Levy
2
keren, ini berfungsi dengan baik, hanya sebuah Note, jika ingin ringkas, bisa disingkat bahkan menjadi -u. select -uSaya akan menggunakan ini pada baris perintah, tetapi ditulis dalam kode, disarankan untuk menggunakan kata-kata PS lengkap:Select-Object -Unique
papo
Ini hanya bekerja dengan satu digit? Untuk daftar array yang besar sepertinya tidak berfungsi.
EagleDev
85

Opsi lainnya adalah menggunakan Sort-Object(alias sort, tetapi hanya di Windows) dengan
-Uniquesakelar, yang menggabungkan pengurutan dengan penghapusan duplikat:

$a | sort -unique
Shay Levy
sumber
2
Ini juga memecahkan masalah saya selanjutnya yaitu bagaimana cara mengurutkan. Terima kasih!
Pengguna Terdaftar
2
Yang ini juga terlihat sedikit lebih cepat.
Gneo Pompeo
7

Jika Anda ingin menjadi bukti bom sepenuhnya, inilah saran saya:

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

Keluaran:

Apples
Banana

Ini menggunakan Propertyparameter untuk pertama Trim()string, jadi spasi ekstra dihapus dan kemudian memilih hanya -Uniquenilainya.

Info lebih lanjut tentang Sort-Object:

Get-Help Sort-Object -ShowWindow
DarkLite1
sumber
1
Jawaban yang luar biasa. Memecahkan masalah saya, Get-Uniquetidak berfungsi karena ruang
Kolob Canyon
7
$a | sort -unique

Ini berfungsi dengan case-insensitive, oleh karena itu menghapus string duplikat dengan case yang berbeda. Memecahkan masalah saya.

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

$ServerList

Keluaran di atas:

FS3
HQ2
Briscomo
sumber
ini juga berfungsi dengan baik untuk array dengan banyak anggota
JoeRod
4

Jika daftar diurutkan, Anda dapat menggunakan cmdlet Get-Unique :

 $a | Get-Unique
Martin Brandl
sumber
2
Ini membutuhkan daftar untuk disortir terlebih dahulu
Johny Skovdal
2

Dengan metode saya, Anda dapat sepenuhnya menghapus nilai duplikat, meninggalkan Anda dengan nilai dari array yang hanya memiliki hitungan 1. Tidak jelas apakah ini yang sebenarnya diinginkan OP, namun saya tidak dapat menemukan contoh solusi ini secara online jadi ini dia.

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

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

Baik Anda menggunakan SORT -UNIQUE, SELECT -UNIQUEatau GET-UNIQUEdari Powershell 2.0 hingga 5.1, semua contoh yang diberikan ada di array Kolom tunggal. Saya belum mendapatkan ini berfungsi di Array dengan beberapa Kolom untuk MENGHAPUS Baris Duplikat untuk meninggalkan kejadian tunggal dari Baris di Kolom tersebut, atau mengembangkan solusi skrip alternatif. Sebaliknya, cmdlet ini hanya mengembalikan Baris dalam Array yang terjadi SEKALI dengan kejadian tunggal dan membuang semua yang memiliki duplikat. Biasanya saya harus Menghapus Duplikat secara manual dari keluaran CSV akhir di Excel untuk menyelesaikan laporan, tetapi terkadang saya ingin terus bekerja dengan data tersebut dalam Powershell setelah menghapus duplikat.

Christopher M Ramos
sumber
di sinilah Where-Object berguna. Pertama-tama Anda mempersempit daftar dengan menggunakan klausa right where, lalu menyalurkannya ke objek-sortir, pilih satu atau lebih kolom untuk diurutkan, dan berikan objek-urutkan-unik.
LPChip