我有一个结构简单的文本文件,它实际上是一个ftp的内容:
1.0
1.0a
10.0
10.0b
11.0
11.0f
2.0
3.0
4.0
...(and so on)
random string
random string
我正在使用 get-content 来获取文件的内容,但随后我希望能够仅检索包含 max 数字和 max-1 数字的行。例如,在这种情况下,我希望它返回:
10.0
10.0b
11.0
11.0f
我尝试使用排序对象但没有成功。有没有一种方法可以以这种方式使用 sort-object ,以便它知道它正在对数字而不是字符串进行排序(这样它就不会在 1 之后放置 10 ),然后根据句号之前的数字进行排序并忽略随机数字符串全部放在最后...
或者如果您有其他建议的方法,请这样做......谢谢。
最佳答案
您可以将脚本 block 传递给某些 cmdlet,在本例中为 Sort-Object
和 Group-Object
。澄清一点:
加载数据
Get-Content foo.txt |
按数字分组(忽略后缀,如果存在):
Group-Object { $_ -replace '\..*$' } |
这将首先删除字符串末尾的非数字,并使用字符串的其余部分(希望现在只包含 float )作为组名称。
按该组名称按数字排序。
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
如果您需要按后缀排序组内的项目(这在最后两组的最终结果中),您可以直接在 Get- 之后粘贴另一个
。Sort-Object
内容
关于sorting - Powershell v2,从文件中获取特定行,排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10370965/