第2行的Powershell排序

时间:2018-11-20 10:44:16

标签: powershell sort-object

我想对.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代码段,以使格式更加美观)

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

您可以使用Get-Content,跳过标题,然后做一些技巧来重建表,但您也可以考虑使用ConvertFrom-SourceTable中的PowerShell Gallery将表直接转换为对象:

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

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

No

之后,您只需使用sort-Object对其进行排序:

Select-Object @{n='No'; e={[Int]$_.No}}, Tool_Name, Tool_Part

将示例放在一起:

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