Menghapus nilai duplikat dari array PowerShell


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

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

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

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

ini juga berfungsi dengan baik untuk array dengan banyak anggota
JoeRod


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

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.


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.