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