在 powershell 中对文本进行数字排序

Sort text numerically in powershell

我需要对文本字符串中的一些数据进行排序。这是一个片段:

0 X6300H_INJ.xtf CSFFILE0032
1 X6301H_INJ.xtf CSFFILE0033
10 X6309H_INJ.xtf CSFFILE0041
11 X6310H_INJ.xtf CSFFILE0042
2 X6311H_INJ.xtf CSFFILE0043

我需要按第一列的数字对这些数据进行排序。我该怎么做?

TheMadTechnician 的有用评论为基础:

  • 传一个script block ({... }) to the Sort-Object cmdlet's (positionally implied)
    -Property parameter, which allows you to determine the sort criterion dynamically for each input line (object), accessible via the automatic $_ variable.

  • 在脚本块中,您可以使用 -split operator 的一元形式将每一行按空格拆分为字段,提取第一个字段,并将其转换为整数([int]),然后用作排序值。

    • 顺便说一句:如果所有输入字符串都代表一个整体的数字,那么解决方案将很简单:

      '1', '10', '9' | Sort-Object { [int] $_ } # -> '1', '9', '10'
      
    • 类似地,如果要排序的数字(字符串)存储在输入对象的 属性 中(注意只是 Sort-Object Prop 词法排序 ):

      @{ Prop='1' }, @{ Prop='10' }, @{ Prop= '9' } |
        Sort-Object { [int] $_.Prop }
      
@'
0 X6300H_INJ.xtf CSFFILE0032
1 X6301H_INJ.xtf CSFFILE0033
10 X6309H_INJ.xtf CSFFILE0041
11 X6310H_INJ.xtf CSFFILE0042
2 X6311H_INJ.xtf CSFFILE0043
'@ -split '\r?\n' |
  Sort-Object { [int] (-split $_)[0] }

注意:@'<newline>...<newline>'@ 是一个(逐字)PowerShell here-string-split '\r?\n' 将多行字符串拆分为行数组。

输出(按第一列数字正确排序):

0 X6300H_INJ.xtf CSFFILE0032
1 X6301H_INJ.xtf CSFFILE0033
2 X6311H_INJ.xtf CSFFILE0043
10 X6309H_INJ.xtf CSFFILE0041
11 X6310H_INJ.xtf CSFFILE0042