【问题标题】:Sort text numerically in powershell在 powershell 中对文本进行数字排序
【发布时间】:2023-02-09 01:44:38
【问题描述】:

我在需要排序的文本字符串中有一些数据。这是一个 sn-p:

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

我需要按第一列对这些数据进行数字排序。我怎样才能做到这一点?

【问题讨论】:

  • 去掉数字后面的所有内容,将它们转换为[int],然后对其进行排序。类似于$RawText | sort {($_ -replace "(\d+)\D.+",'$1') -as [int]}
  • 首先把它放在一个 json 文件中,第一个字段是一个数字。 :)

标签: powershell sorting text


【解决方案1】:

TheMadTechnician的有用评论为基础:

  • script block ({... }) 传递给 Sort-Object cmdlet(位置隐含)
    -Property 参数,它允许您为每个输入行(对象)动态确定排序标准,可通过 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 '
?
' |
  Sort-Object { [int] (-split $_)[0] }

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-22
    • 2018-04-02
    • 1970-01-01
    • 2020-04-02
    • 2022-01-01
    • 1970-01-01
    • 2012-09-20
    相关资源
    最近更新 更多