スクリプトブロックを一部のコマンドレット(この場合はSort-Object
および)に渡すことができGroup-Object
ます。もう少し明確にするために:
データをロードする
Get-Content foo.txt |
番号でグループ化します(接尾辞が存在する場合は無視します):
Group-Object { $_ -replace '\..*$' } |
これにより、最初に文字列の末尾にある数字以外の数字が削除され、文字列の残りの部分(できれば浮動小数点数のみが含まれるようになります)がグループ名として使用されます。
そのグループ名で数値で並べ替えます。
Sort-Object { [int] $_.Name } |
これは、元の行から派生したものでグループ化したのと同じように、グループの名前を数値に変換して並べ替えるだけで実行できます。
次に、最後の2つのグループを取得します。これは、最大数と最大数から2番目の数のすべての行を表し、グループをアンラップします。-Last
パラメータはかなり自明で-ExpandProperty
あり、フィルタリングされたプロパティリストを使用して新しいオブジェクトを作成する代わりに、プロパティの値を選択します。
Select-Object -Last 2 -ExpandProperty Group
そして、そこにあります。このパイプラインをさまざまな段階で試して、コマンドの目的を理解することができます。
PS Home:\> gc foo.txt
1.0
1.0a
10.0
10.0b
11.0
11.0f
2.0
3.0
4.0
PS Home:\> gc foo.txt | group {$_ -replace '\..*$'}
Count Name Group
----- ---- -----
2 1.0 {1.0, 1.0a}
2 10.0 {10.0, 10.0b}
2 11.0 {11.0, 11.0f}
1 2.0 {2.0}
1 3.0 {3.0}
1 4.0 {4.0}
PS Home:\> gc foo.txt | group {$_ -replace '\..*$'} | sort {[int]$_.Name}
Count Name Group
----- ---- -----
2 1.0 {1.0, 1.0a}
1 2.0 {2.0}
1 3.0 {3.0}
1 4.0 {4.0}
2 10.0 {10.0, 10.0b}
2 11.0 {11.0, 11.0f}
PS Home:\> gc foo.txt | group {$_ -replace '\..*$'} | sort {[int]$_.Name} | select -l 2 -exp group
10.0
10.0b
11.0
11.0f
グループ内のアイテム(および最後の2つのグループの最終結果)がサフィックスでソートされている必要がある場合は、のSort-Object
直後に別のアイテムを貼り付けることができますGet-Content
。