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_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
我想对 .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_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