ค้นหาเว็บไซต์

วิธีค้นหารายการที่ซ้ำกันในอาร์เรย์ใน PowerShell


คุณจำเป็นต้องค้นหาองค์ประกอบที่ซ้ำกันจากอาร์เรย์ใน PowerShell หรือไม่? ในบทช่วยสอน PowerShell นี้ ฉันจะอธิบายวิธีค้นหารายการที่ซ้ำกันในอาร์เรย์ใน PowerShell โดยใช้วิธีการและตัวอย่างต่างๆ

หากต้องการค้นหารายการที่ซ้ำกันในอาร์เรย์ใน PowerShell คุณสามารถใช้ cmdlet Group-Object และกรองสำหรับกลุ่มที่มีการนับมากกว่าหนึ่ง เช่น $duplicates=$array | กลุ่มวัตถุ | โดยที่วัตถุ { $_.Count -gt 1 } | ForEach-Object { $_.Name } จะส่งคืนรายการค่าที่ซ้ำกันจากอาร์เรย์ $array

ค้นหารายการที่ซ้ำกันในอาร์เรย์ใน PowerShell

ใน PowerShell คุณสามารถสร้างอาร์เรย์ได้โดยการกำหนดค่าหลายค่าให้กับตัวแปรตัวเดียว โดยคั่นด้วยเครื่องหมายจุลภาค

$myArray = "apple", "banana", "cherry", "apple", "banana"

ในตัวอย่างข้างต้น $myArray คืออาร์เรย์ที่มีห้ารายการ รวมถึงรายการซ้ำบางรายการด้วย ตอนนี้ให้เราตรวจสอบวิธีการต่างๆเพื่อค้นหารายการที่ซ้ำกันจากอาร์เรย์ PowerShell โดยใช้วิธีต่างๆ

วิธีที่ 1: การใช้กลุ่ม-วัตถุ

Group-Object cmdlet เป็นวิธีที่ตรงไปตรงมาในการจัดกลุ่มวัตถุใน PowerShell เมื่อพูดถึงอาร์เรย์ คุณสามารถใช้เพื่อจัดกลุ่มรายการที่คล้ายกันและนับจำนวนได้ หากต้องการค้นหารายการที่ซ้ำกัน คุณสามารถกรองกลุ่มเหล่านี้เพื่อค้นหากลุ่มใดๆ ที่มีจำนวนมากกว่าหนึ่งได้

นี่คือตัวอย่าง:

$myArray = "apple", "banana", "cherry", "apple", "banana"
$duplicates = $myArray | Group-Object | Where-Object { $_.Count -gt 1 }
$duplicates | Foreach-Object { $_.Name }

สคริปต์นี้จะส่งออก apple และ banana เนื่องจากรายการเหล่านี้เป็นรายการที่ปรากฏในอาร์เรย์มากกว่าหนึ่งครั้ง คุณสามารถดูผลลัพธ์ได้ในภาพหน้าจอด้านล่าง:

วิธีที่ 2: การใช้ Select-Object

อีกวิธีหนึ่งเกี่ยวข้องกับการใช้ cmdlet Select-Object พร้อมด้วยสวิตช์ -Unique ซึ่งจะกรองรายการที่ซ้ำกันออกไป วิธีการนี้มีประโยชน์ถ้าคุณต้องการดูค่าเฉพาะของอาร์เรย์ PowerShell อย่างไรก็ตาม หากต้องการค้นหารายการที่ซ้ำกัน คุณต้องเปรียบเทียบอาร์เรย์ที่ไม่ซ้ำกับอาร์เรย์ดั้งเดิม

นี่คือวิธีที่คุณสามารถทำได้:

$myArray = "apple", "banana", "cherry", "apple", "banana"
$unique = $myArray | Select-Object -Unique
$duplicates = $myArray | Where-Object { $unique -notcontains $_ }

ในสคริปต์นี้ $unique จะมีองค์ประกอบที่ไม่ซ้ำทั้งหมด และ $duplicates จะมีองค์ประกอบที่ซ้ำกันหลังจากเปรียบเทียบกับอาร์เรย์ดั้งเดิม

วิธีที่ 3: การใช้การเปรียบเทียบแบบกำหนดเอง

คุณยังสามารถเขียนสคริปต์แบบกำหนดเองเพื่อค้นหารายการที่ซ้ำกันจากอาร์เรย์ PowerShell คุณสามารถเขียนสคริปต์ที่วนซ้ำอาร์เรย์และตรวจสอบรายการที่ซ้ำกันโดยการติดตามรายการที่ถูกดูไปแล้ว

นี่คือสคริปต์ที่กำหนดเองเพื่อค้นหารายการที่ซ้ำกัน:

$myArray = "apple", "banana", "cherry", "apple", "banana"
$seen = @{}
$duplicates = @()

foreach ($item in $myArray) {
    if ($seen[$item]) {
        $duplicates += $item
    } else {
        $seen[$item] = $true
    }
}

$duplicates = $duplicates | Select-Object -Unique
$duplicates

สคริปต์นี้ใช้ $seen แบบแฮชเพื่อติดตามรายการที่มีการทำซ้ำ หากมีรายการอยู่ใน hashtable อยู่แล้ว รายการนั้นจะถูกเพิ่มลงในอาร์เรย์ $duplicates สุดท้ายนี้ เราจะกรอง $duplicates ให้เป็นเฉพาะค่าที่ไม่ซ้ำเท่านั้น เนื่องจากสามารถเพิ่มรายการที่ซ้ำกันเดียวกันได้หลายครั้ง

คุณสามารถดูผลลัพธ์ได้ในภาพหน้าจอด้านล่าง:

วิธีที่ 4: การใช้ LINQ ใน PowerShell

สำหรับผู้ที่ก้าวหน้ากว่าเล็กน้อยและคุ้นเคยกับ .NET แล้ว PowerShell สามารถใช้ประโยชน์จาก LINQ (Language-Integrated Query) เพื่อค้นหารายการที่ซ้ำกัน นี่เป็นวิธีการที่ซับซ้อนกว่าแต่อาจมีประสิทธิภาพมากสำหรับชุดข้อมูลขนาดใหญ่

$myArray = "apple", "banana", "cherry", "apple", "banana"
$duplicates = [System.Linq.Enumerable]::ToLookup([object[]]$myArray, [Func[object, object]]{param($i) $i}) |
    Where-Object { $_.Count -gt 1 } |
    Foreach-Object { $_.Key }

สคริปต์นี้จะแปลงอาร์เรย์เป็นการค้นหา โดยที่แต่ละรายการคือคีย์ และกรองคีย์ที่มีมากกว่าหนึ่งรายการออก ซึ่งบ่งชี้ถึงรายการที่ซ้ำกัน

บทสรุป

การค้นหารายการที่ซ้ำกันในอาร์เรย์เป็นเรื่องง่ายและสามารถทำได้หลายวิธีใน PowerShell คุณสามารถใช้ Group-Object, Select-Object, สคริปต์เปรียบเทียบที่กำหนดเอง หรือแม้แต่ LINQ

ในบทความนี้ ฉันได้อธิบายวิธีค้นหารายการที่ซ้ำกันในอาร์เรย์ใน PowerShell โดยใช้วิธีการต่างๆ

บทความที่เกี่ยวข้อง