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