sorting - Powershell v2,从文件中获取特定行,排序

标签 sorting powershell

我有一个结构简单的文本文件,它实际上是一个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-ObjectGroup-Object。澄清一点:

  1. 加载数据

    Get-Content foo.txt |
    
  2. 按数字分组(忽略后缀,如果存在):

        Group-Object { $_ -replace '\..*$' } |
    

    这将首先删除字符串末尾的非数字,并使用字符串的其余部分(希望现在只包含 float )作为组名称。

  3. 按该组名称按数字排序。

        Sort-Object { [int] $_.Name } |
    

    只需将组的名称转换为数字并按该数字进行排序即可完成此操作,类似于我们按从原始行派生的内容进行分组的方式。

  4. 然后我们可以获得最后两个,分别代表具有最大编号和倒数第二个编号的所有行,并展开这些组。 -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/

相关文章:

performance - 回归 n log(n) 排序

parsing - Powershell 解析文本文件的一部分并保存到 CSV

powershell - 尾随日志文件,如果匹配则触发 Action

Powershell:具有每日触发和重复间隔的计划任务

rest - 在此处字符串 header 之后但在行尾之前不允许使用任何字符

powershell - PowerShell 中的嵌套哈希表导出?

c# - 如何对拆分数组进行排序以从最高到最低读取?

sql - 在第一个结果后更改排序标准

python - 通过将列表转换为集合然后再转换回列表来对列表进行排序的时间复杂度

java - 需要创建一个对数字进行排序的java代码