Powershell 从第 2 行开始排序

Powershell sort from line 2

我想对 .txt 文档进行排序,以便第一行保持在最前面,其余的按数字排序。

我目前有以下内容,但它删除了第一行,并且排序不正确,因为数字是例如72、2、51、100、201、5 等 所以它将它排序为 100、2、201、5、51、72。

我希望将其排序为 2、5、51、72、100、201

$emptyLine = Get-Content C:\Path\Document.txt | Select-Object -Skip 1
$emptyLine | Sort-Object | Out-File C:\Path\Document.txt

我知道这在 Notepad++ 中是可能的,但是需要进行排序的机器不允许安装任何新的东西。

如果有任何解决方案,我都非常开放,不需要我安装新软件。

机器是Windows 10 Pro x64.

Current Picture

Desired result

Current Result

No        Tool_Name        Tool_Part
72        10        1      9.    1
43        36        3      29.     1
102       34        1      1.7     1
600       33        1      3.      1
76        3         1      5.3     1
75        3         1      5.5     1
251       2         3      3.      1
73        10        1      5.3     1
50        36        3      15.9    1
64        2         1      6.      1

(发布为 HTML 片段,使格式更美观)

利用多值赋值并将 Get-Content 的输出存储在两个变量中,然后仅对第二个进行排序:

$First,$Rest = Get-Content C:\Path\Document.txt
@($First; $Rest |Sort-Object) |Set-Content C:\Path\Document.txt

在上面的场景中,PowerShell 会将第一行分配给 $First,其余的分配给 $Rest

如果您需要 Sort-Object 对字符串 属性 的第一部分进行排序,就像它是一个整数一样,您可以这样做:

@($First; $Rest |Sort-Object {(-split $_)[0] -as [int]}) |Set-Content C:\Path\Document.txt

您可以使用 Get-Content, skip the header and than do some tricks to rebuild your table but you might also consider using the ConvertFrom-SourceTable from the PowerShell Gallery 将您的 table 直接转换为对象:

$List = Get-Content C:\Path\Document.txt | ConvertFrom-SourceTable

不幸的是,第一列中的数字似乎是左对齐的,如果它们右对齐(如本答案的最终结果所示),ConvertFrom-SourceTable cmdlet 会自动评估第一个 'No' 列转换成数字。
这意味着您需要自己将第一列转换为整数,以便能够按照建议对它们进行排序。您可以通过使用 Select-Object 并创建计算的 属性:

来完成此操作
Select-Object @{n='No'; e={[Int]$_.No}}, Tool_Name, Tool_Part

之后,你可以简单地使用sort-Object来排序:

Sort-Object No

举个例子:

ConvertFrom-SourceTable '
    No        Tool_Name        Tool_Part
    72        10        1      9.      1
    43        36        3      29.     1
    102       34        1      1.7     1
    600       33        1      3.      1
    76        3         1      5.3     1
    75        3         1      5.5     1
    251       2         3      3.      1
    73        10        1      5.3     1
    50        36        3      15.9    1
    64        2         1      6.      1
' | Select-Object @{n='No'; e={[Int]$_.No}}, Tool_Name, Tool_Part | Sort-Object No

此示例将导致:

 No Tool_Name Tool_Part
 -- --------- ---------
 43 36        29.     1
 50 36        15.9    1
 64 2         6.      1
 72 10        9.      1
 73 10        5.3     1
 75 3         5.5     1
 76 3         5.3     1
102 34        1.7     1
251 2         3.      1
600 33        3.      1

由于不清楚 Tool_NameTool_Part 之间的列是否属于任何一列(因为 Tool_Part 可以左对齐或右对齐),您可以提供给 ConvertFrom-SourceTable 一个尺子自己来解决这个问题:

ConvertFrom-SourceTable -Ruler '---       -----------      ---------' '
No        Tool_Name        Tool_Part
72        10        1      9.      1
43        36        3      29.     1
102       34        1      1.7     1
600       33        1      3.      1
76        3         1      5.3     1
75        3         1      5.5     1
251       2         3      3.      1
73        10        1      5.3     1
50        36        3      15.9    1
64        2         1      6.      1
' | Select-Object @{n='No'; e={[Int]$_.No}}, Tool_Name, Tool_Part | Sort-Object No

结果:

 No Tool_Name   Tool_Part
 -- ---------   ---------
 43 36        3 29.     1
 50 36        3 15.9    1
 64 2         1 6.      1
 72 10        1 9.      1
 73 10        1 5.3     1
 75 3         1 5.5     1
 76 3         1 5.3     1
102 34        1 1.7     1
251 2         3 3.      1
600 33        1 3.      1