1

我想对一个 .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。

当前图片

期望的结果

当前结果

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 片段,以使格式更美观)

4

2 回答 2

5

利用多值赋值并将输出存储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
于 2018-11-20T11:00:22.460 回答
2

您可以使用Get-Content, 跳过标题,而不是使用一些技巧来重建表,但您也可以考虑使用ConvertFrom-SourceTablePowerShell中的 将表直接转换为对象:

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

不幸的是,第一列中的数字似乎是左对齐的,如果它们右对齐(如本答案的最终结果所示),ConvertFrom-SourceTablecmdlet 会自动将第一个“ 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_Name属于Tool_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
于 2018-11-20T12:27:43.947 回答