Xóa các giá trị trùng lặp khỏi mảng PowerShell


Câu trả lời:


193

Sử dụng Select-Object(có bí danh là select) với công -Uniquetắc; ví dụ:

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

9
Điều đó quá dễ dàng :-(. Trong PowerShell 2, bạn cũng có thể sử dụng Get-Unique(hoặc gu) nếu mảng của bạn đã được sắp xếp.
Joey

2
Johannes, Get-Unique có sẵn trong v1 :)
Shay Levy

2
tuyệt, điều này hoạt động tốt, chỉ là Ghi chú, nếu bạn muốn ngắn gọn, nó có thể được rút ngắn thậm chí còn -u. select -uTôi sẽ sử dụng điều này trên một dòng lệnh, nhưng được viết bằng mã, nên sử dụng từ ngữ PS đầy đủ:Select-Object -Unique
papo

Điều này chỉ hoạt động với một chữ số? Đối với một danh sách lớn các mảng, nó dường như không hoạt động.
EagleDev

85

Một tùy chọn khác là sử dụng Sort-Object(có bí danh sort, nhưng chỉ trên Windows) với công
-Uniquetắc, kết hợp việc sắp xếp với loại bỏ các bản sao:

$a | sort -unique

2
Điều này cũng giải quyết vấn đề tiếp theo của tôi là làm thế nào để tôi sắp xếp nó. Cảm ơn!
Người dùng đã đăng ký

2
Cái này cũng nhanh hơn một chút.
Gneo Pompeo

7

Trong trường hợp bạn muốn được chứng minh hoàn toàn bằng bom, đây là những gì tôi sẽ khuyên:

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

Đầu ra:

Apples
Banana

Điều này sử dụng Propertytham số để đầu tiên Trim()các chuỗi, vì vậy các khoảng trắng thừa bị loại bỏ và sau đó chỉ chọn các -Uniquegiá trị.

Thông tin thêm về Sort-Object:

Get-Help Sort-Object -ShowWindow

1
Câu trả lời tuyệt vời. Đã giải quyết vấn đề của tôi, Get-Uniquekhông hoạt động vì không gian
Kolob Canyon

7
$a | sort -unique

Điều này hoạt động với phân biệt chữ hoa chữ thường, do đó loại bỏ các chuỗi trùng lặp với các trường hợp khác nhau. Đã giải quyết vấn đề của tôi.

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

$ServerList

Các kết quả trên:

FS3
HQ2

điều này cũng hoạt động tốt cho các mảng có nhiều thành viên
JoeRod


2

Với phương pháp của tôi, bạn có thể loại bỏ hoàn toàn các giá trị trùng lặp, để lại cho bạn các giá trị từ mảng chỉ có tổng số 1. Không rõ đây có phải là điều OP thực sự muốn hay không, tuy nhiên tôi không thể tìm thấy ví dụ về giải pháp này trực tuyến. nó đây.

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

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

2

Cho dù bạn đang sử dụng SORT -UNIQUE, SELECT -UNIQUEhoặc GET-UNIQUEtừ Powershell 2,0-5,1, tất cả các ví dụ đưa ra là trên mảng cột duy nhất. Tôi vẫn chưa làm cho điều này hoạt động trên Mảng có nhiều Cột để LOẠI BỎ Hàng trùng lặp để để lại các lần xuất hiện đơn lẻ của Hàng trên các Cột nói trên hoặc phát triển giải pháp tập lệnh thay thế. Thay vào đó, những lệnh ghép ngắn này chỉ trả về Hàng trong Mảng xảy ra MỘT LẦN với sự xuất hiện số ít và loại bỏ mọi thứ có bản sao. Thông thường, tôi phải loại bỏ các bản sao theo cách thủ công khỏi đầu ra CSV cuối cùng trong Excel để hoàn thành báo cáo, nhưng đôi khi tôi muốn tiếp tục làm việc với dữ liệu đã nói trong Powershell sau khi loại bỏ các bản sao.


đây là nơi mà Đối tượng có ích. Trước tiên, bạn thu hẹp danh sách bằng cách sử dụng mệnh đề where bên phải, sau đó chuyển nó đến một đối tượng sắp xếp, chọn một hoặc nhiều cột để sắp xếp và đặt đối tượng sắp xếp là một-đơn vị.
LPChip
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.