さて、オブジェクトのカウントですが、色々なやり方があります。 今回は、HashTableを使った考えていなかった方法があったのでご紹介です。
#PSTip Count occurrences of a word using a hash table
カウント対象
計測対象は以下の文字の個数です。
'three','three','one','three','two','two'
私ならどうするか
私の場合はこのように考えます。
$wordList = 'three','three','one','three','two','two' $wordList | group $_ | %{[PSCustomObject]@{Value=$_.Name;Count=$_.Count}} | sort Value
改行入れるならこうです。
$wordList = 'three','three','one','three','two','two' $wordList ` | group $_ ` | %{ [PSCustomObject]@{ Value=$_.Name; Count=$_.Count} } ` | sort Value
Format-Tableでの結果です。
Value Count ----- ----- one 1 three 3 two 2
牟田口先生の案
なるほど…PSCustomObjectはなるべく避けたいか…、納得です。
$wordList = 'three','three','one','three','two','two' $wordList | group -NoElement $_
結果表示です。
Count Name ----- ---- 3 three 1 one 2 two
紹介するやり方
うまくHashTableを使ってます
$wordList = 'three','three','one','three','two','two' $wordStatistic = $wordList | ForEach-Object -Begin { $wordCounts=@{} } -Process { $wordCounts.$_++ } -End { $wordCounts } $wordStatistic
結果表示です。
Name Value ---- ----- one 1 three 3 two 2
HashTableのインクリメントでの使い方、面白いです。 PowerShellというより、AWK的な考えな感じもしますがとても興味深かったので参考にどうぞw
単純にこれでは
まぁSelectでもいい気もしますが…んー色々あって余りSelectを使うのは好きじゃないです。
$wordList = 'three','three','one','three','two','two' $wordList | group $_ | Select Name,Count
Format-Tableでの結果です。
Name Count ---- ----- three 3 one 1 two 2
速度
ちなみに速度的には…さてさてw
# 私のやり方 TotalSeconds : 0.0004608 # 牟田口先生のやり方 TotalSeconds : 0.0002187 # 紹介したHashTableのやり方 TotalSeconds : 0.00331 # groupしてselect TotalSeconds : 0.0004079
なるほ、牟田口先生のやり方でいきましょう。