Powershell сортировать из строки 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.

Текущая картинка

Желаемый результат

Текущий результат

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 ответа

Решение

Воспользуйтесь преимуществами многозначного присваивания и сохраните выходные данные 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, пропустите заголовок и затем сделайте несколько трюков, чтобы восстановить таблицу, но вы также можете рассмотреть возможность использования ConvertFrom-SourceTable из галереи PowerShell, чтобы преобразовать таблицу непосредственно в объекты:

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

К сожалению, числа в первом столбце выглядят выровненными по левому краю, если они выровнены по правому краю (как в окончательных результатах этого ответа), ConvertFrom-SourceTable Командлет автоматически оценил бы первый ' 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
Другие вопросы по тегам