如何在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
答案 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
替换为您选择的相关解决方案中的变量以及其他答案。