การลบค่าที่ซ้ำกันออกจากอาร์เรย์ PowerShell


คำตอบ:


193

ใช้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
Johannes, Get-Unique มีอยู่ใน v1 :)
Shay Levy

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ไม่ได้ผลเพราะเว้นวรรค
Kolob Canyon

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 ตัวอย่างทั้งหมดให้อยู่ในอาร์เรย์คอลัมน์เดียว ฉันยังไม่ได้ทำให้สิ่งนี้ทำงานข้ามอาร์เรย์ที่มีหลายคอลัมน์เพื่อลบแถวที่ซ้ำกันเพื่อปล่อยให้เกิดแถวเดียวข้ามคอลัมน์ดังกล่าวหรือพัฒนาโซลูชันสคริปต์ทางเลือก แต่ cmdlet เหล่านี้จะส่งคืนเฉพาะแถวในอาร์เรย์ที่เกิดขึ้นครั้งเดียวโดยมีเหตุการณ์เอกพจน์และทิ้งทุกอย่างที่ซ้ำกัน โดยปกติฉันต้องลบรายการที่ซ้ำกันด้วยตนเองจากเอาต์พุต CSV สุดท้ายใน Excel เพื่อทำรายงานให้เสร็จ แต่บางครั้งฉันก็ต้องการทำงานกับข้อมูลดังกล่าวต่อไปใน Powershell หลังจากลบรายการที่ซ้ำกัน


นี่คือจุดที่วัตถุมีประโยชน์ อันดับแรกคุณ จำกัด รายการให้แคบลงโดยใช้ตำแหน่งที่ถูกต้องจากนั้นไปป์ไปยังวัตถุการเรียงลำดับเลือกหนึ่งคอลัมน์ขึ้นไปเพื่อจัดเรียงและกำหนดให้วัตถุการเรียงเป็น - ไม่ซ้ำกัน
LPChip
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.