PowerShellで重複項目を抽出してみた

先日、重複項目を無くすためにGet-Uniqueを使った。
GNU版のuniqにはrepeatedというオプションで重複項目のみを出力する機能があるのだが、Get-Uniqueにはそのようなオプションは無さそうだし、そういう機能をするコマンドレットも無いようだ。


なので作ってみる。


とりあえず元になる文字列のリストを配列に突っ込む。

PS > $a = gc ./a.txt

これで$aは文字列オブジェクトの配列になった。


次。$aをフィルタリングして重複項目のみを取り出すには、Where-Objectが使えそうだ。
Where-Objectはパイプラインで渡されてきたオブジェクトひとつひとつにパラメータブロックで指定した条件式を適用してくれる。Where-Objectのエイリアスは?。

PS > $a | ? {if(($a -eq $_).count -ge 2){ $_ }}

$_はパイプラインで引き渡されるオブジェクトひとつ。これが$aにいくつ含まれているかを表すのが($a -eq $_).countで、重複項目を抽出するので2つ以上なら$_を出力する。


このままだと重複項目がそのまま複数出力されてしまうので更にsort | guする。で、ファイルに出力。

PS > $a | ? {if(($a -eq $_).count -ge 2){ $_ }} |
>> sort | gu | out-file ./b.txt -encoding default

出来た。