PowerShell Get-Unique 陣列資料集合化 去除重複的元素

2021-08-04

教學如何使用 PowerShell 對陣列資料進行 Get-Unique 操作,移除重複的元素,需要注意的是 PowerShell 的 Unique 需要先進行 Sort-Object 對陣列進行排序。

logo

說明

基礎的使用方式

(1,2,3,4,5,1,2,3)  | Sort-Object | Get-Unique
# 1,2,3,4,5

資料夾應用情境

使用範例,取得 Current Diretory 中的 File Extension 集合:

Get-ChildItem -file 
  | % {$_.extension} 
  | Sort-Object | Get-Unique 
  | Set-Clipboard

文字檔應用情境

使用範例,將文字檔中的文章段落分割空白成為字串陣列後,移除重複出現的字串:

plain.txt

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras pulvinar libero et dui tempor, eu fermentum felis volutpat. Sed odio ligula, imperdiet eu auctor et, cursus ac metus. Vivamus vitae est congue, eleifend sapien eget, consequat est. Mauris dictum mollis imperdiet. Sed tempus urna facilisis tellus placerat pretium. Curabitur nec dolor sed sem ornare suscipit imperdiet eu dui. Fusce nec pharetra dui.

Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Praesent sed fringilla velit. Pellentesque at blandit eros. Quisque eros mauris, molestie nec orci vel, convallis imperdiet justo. Suspendisse potenti. Fusce ac erat sed lacus venenatis suscipit ac sed mi. Suspendisse ac justo eget quam sodales ultrices at ac nibh. Duis sit amet ultricies ligula.

Donec arcu nisi, porttitor sit amet sollicitudin vitae, iaculis tincidunt enim. Sed vitae egestas massa. Fusce et felis vitae neque euismod placerat. Mauris vitae pharetra mauris. Praesent pharetra varius finibus. Morbi ultrices nec mi non lacinia. Curabitur sit amet dictum tellus. Donec non feugiat lorem. Sed mauris erat, pharetra quis eros sit amet, porta vulputate risus. Aenean dictum eros a lectus fermentum fermentum. Nulla sit amet nulla gravida, pretium metus id, facilisis turpis. Nulla ante lorem, facilisis ac egestas in, aliquet non ex. Maecenas viverra placerat arcu eget eleifend. Aliquam rutrum egestas lorem ut dapibus. Morbi scelerisque ligula sed ipsum fermentum pretium.

powershell script

$strArray = get-content .\plain.txt | % {$_ -split ' '} | % {$_.replace('.', '')}

$strArray.length
# 223

($strArray | sort-object | get-unique).length
# 143

另補充 split 的另一種語法表示方式,同時加上 where-object(?) 比較的方式來篩除陣列元素:

$strArray = get-content .\plain.txt | % Split ' '| ? {$_ -ne 'lorem'} 

參考資料

MSDocs - Get-Unique

MSDocs - Get-Content