如何在PowerShell中按列排序?

时间:2018-01-17 00:49:03

标签: powershell cmd powershell-v2.0

如何在PowerShell中按第3列排序文本文件? 这是文件的一部分:

    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
    ali              samadi          6      1
    mohsen           adibi           3      1
    firooz           karimi          7      1
    mostafa          rostamian       18     1
    jafar            omidi           6      1
    shima            zagrosi         12     2
    somayyeh         modaberi        16     2
    shahram          zamani          16     1
    sayeh            rahmati         3      2
    shirin           rahjoo          12     2

我试过

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

3 个答案:

答案 0 :(得分:2)

这是一个潜在的解决方案:

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

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

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

此后$Line现在是一个数组,其中每个元素都不包含空格,因此我们创建了一个自定义PowerShell对象,我们为每个项目命名并从$Line访问它的相应值通过数组索引运算符[0] .. [1]等我们将值列转换为[int],以便稍后对它们进行正确排序(相比它将它们视为字符串)。

现在我们输出了PowerShell对象,我们可以使用FirstValue属性将结果导出到Sort-Object,然后将其发送到Format-Table以获取表结果。

答案 1 :(得分:2)

你已经差不多了。你的代码没有按预期方式工作的原因是Split()方法将字符串拆分为每个空间,因此你得到了很多空列。你真正想要的是在连续的空格中分割。要做后者,请使用-split运算符:

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

答案 2 :(得分:1)

因此,您已经有2个关于如何获得结果的答案,我正在添加一个关于如何发送电子邮件的答案,这是您原始要求的一部分。您编辑了删除它的问题,但我已经完成了大部分答案,所以无论如何我都会发布它。

使用powershell' s Send-MailMessage在Windows系统上标准化,方法是在批处理文件中运行它:

注意!! 必须是PowerShell 2.0或更高版本。

powershell Send-MailMessage 
           -From "someone@someserver.net"
           -To "whoever@gmail.com"
           -Subject "Test email"
           -Body "This is a test"
           -SmtpServer Some_exhange_server_name

为了便于阅读,我使用新行分解了上述文字,但它应该是一行,如下所示。

Send-MailMessage -From "someone@someserver.net" -To "whoever@gmail.com" -Subject "Test email" -Body "This is a test" -SmtpServer some_exhange_Server_name

您所要做的就是将正文This is a test替换为您选择的相关解决方案中的变量以及其他答案。