How can I sort by column in PowerShell?

Hod*_*deh 2 powershell cmd powershell-2.0

how can I sort a text file by 3rd column in PowerShell? That is part of the file:

    reza             zabihi          12     1
    maryam           joraee          17     2
    leyla            ahmadi          13     2
    farzin           farahbakhsh     16     1
    keyvan           maleki          8      1
    kaveh            ahangar         18     1
    nooshafarin      bakhtiari       13     2
    roya             afrashteh       13     2
    asghar           nazemi          18     1
    jaleh            nooruzi         16     2
    阿里萨马迪 6 1
    莫森阿迪比 3 1
    菲鲁兹卡里米 7 1
    莫斯塔法罗斯塔米安 18 1
    贾法尔奥米迪 6 1
    岛 zagrosi 12 2
    somayyeh modaberi 16 2
    沙赫拉姆·扎马尼 16 1
    赛耶拉玛蒂 3 2
    shirin rahjoo 12 2

我试过

Get-Content namef | Sort-Object { [double]$_.Split()[-2] } -Descending
Run Code Online (Sandbox Code Playgroud)

Ans*_*ers 6

你快到了。您的代码无法按您预期的方式工作的原因是该Split()方法在每个空格处拆分字符串,因此您会得到很多空列。你真正想要的是在连续的空白处分割。要执行后者,请使用-split运算符:

Get-Content namef | Sort-Object { [double]($_ -split '\s+')[-2] } -Descending
Run Code Online (Sandbox Code Playgroud)


Mar*_*agg 5

这是一种可能的解决方案:

Get-Content yourfile.txt | ForEach-Object {
    $Line = $_.Trim() -Split '\s+'

    New-Object -TypeName PSCustomObject -Property @{
        FirstName = $Line[0]
        LastName = $Line[1]
        FirstValue = [int]$Line[2]
        SecondValue = [int]$Line[3]
    }

} | Sort-Object FirstValue | Format-Table
Run Code Online (Sandbox Code Playgroud)

这用于Get-Content加载文件,然后使用ForEach-Object循环迭代该文件的每一行(其中该行由自动变量 表示$_)。

它使用行上的方法删除尾随空格,然后使用表示一个或多个空格的.Trim()RegEx 字符串分割行。\s+

现在这$Line是一个数组,其中每个元素不包括空格,因此我们创建一个自定义 PowerShell 对象,在其中为每个项目指定一个名称,并通过$Line数组索引运算符访问它对应的值[0][1]我们将值列转换[int]为它们稍后将被正确排序(而不是将它们视为字符串)。

Sort-Object现在我们已经输出了一个 PowerShell 对象,我们可以简单地使用 FirstValue 属性将结果通过管道输出,然后将其发送到Format-Table以获取表结果。