您可以将脚本块传递给某些 cmdlet,在这种情况下Sort-Object
和Group-Object
. 再澄清一点:
加载数据
Get-Content foo.txt |
按数字分组(忽略后缀,如果存在):
Group-Object { $_ -replace '\..*$' } |
这将首先删除字符串末尾的非数字,并使用字符串的其余部分(希望现在只包含一个浮点数)作为组名。
按该组名称按数字排序。
Sort-Object { [int] $_.Name } |
只需将组的名称转换为数字并按此排序即可完成,类似于我们根据原始行派生的内容进行分组的方式。
然后我们可以得到最后两组,代表所有具有最大数量和第二大数量的行,然后展开这些组。该-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
如果您需要按后缀排序的组中的项目(以及最后两组的最终结果),您可以Sort-Object
直接在Get-Content
.