Powershell сортировать из строки 2 - PullRequest
0 голосов
/ 20 ноября 2018

Я хочу отсортировать документ .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 ]

0 голосов
/ 20 ноября 2018

Вы можете использовать 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
0 голосов
/ 20 ноября 2018

Воспользуйтесь преимуществами многозначного присваивания и сохраните выходные данные из 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
...