我用Linux编写了这个Linux Shell脚本,现在我想用PowerShell编写它
manu="$1"
sort -t';' -nrk3 auto1.dat | grep "$manu" | head -n1 | cut -d';' -f2我的确是这样想的:
$car = Import-Csv -Header "Manufacturer" , "Model" , "Price" -delimiter ';' auto.dat
$car | % { $_.Price = [int]$_.Price }
$car | Sort-Object Price -Descending但我可以找到有关如何做grep和头或削减的信息,我尝试了一些东西,但它没有工作。所以基本上我想要的是
.\car.ps1 Tesla这段代码会给我提供昂贵的特斯拉型号。
auto.dat文件包含汽车、车型和价格:
兰博基尼;阿文塔多;700000兰博基尼;乌鲁斯;200000特斯拉;车型;180000特斯拉;ModelX;140000福特;野马;300000福特;福克斯;奥迪20000;A8;100000奥迪;R8;500000
发布于 2017-12-08 19:00:10
你想看看Get-Help about_Functions_Advanced_Parameters和Get-Help about_Functions_Advanced。通过删除函数语句和外部大括号,可以使脚本像函数一样工作。
因此,您可以使用以下函数:
function car {
[CmdletBinding()]
Param (
[Parameter(Mandatory=$true,Position=1)]
[String]
$Manufacturer
)
Import-Csv -Path auto.dat -Header "Manufacturer","Model","Price" -Delimiter ';' |
Where-Object { $_.Manufacturer -match $Manufacturer } |
Sort-Object -Property @{e={[int]$_.Price}} -Descending |
Select-Object -First 1
}并将其保存为.\Car.ps1
[CmdletBinding()]
Param (
[Parameter(Mandatory=$true,Position=1)]
[String]
$Manufacturer
)
Import-Csv -Path auto.dat -Header "Manufacturer","Model","Price" -Delimiter ';' |
Where-Object { $_.Manufacturer -match $Manufacturer } |
Sort-Object -Property @{e={[int]$_.Price}} -Descending |
Select-Object -First 1称之为:
.\Car.ps1 -Manu Audi
.\Car.ps1 -M Tesla
.\Car.ps1 Ford发布于 2017-12-08 19:00:52
当涉及管道时,您需要注意PowerShell和bash (通常是Unix)之间的主要区别是,在PowerShell中,您通常处理的是真实的对象,而不是文本流。
因此,到目前为止,您所做的工作的优点是您根本不需要head和cut命令。
head命令,哪个(大概是?)跳过标题行,已经通过将标题指定为Import-Csv来处理。
Import-Csv的结果是一个对象数组(每行一个),CSV中的每个列都是行对象的单个属性,其名称与标题相同。
如果要在第一行中使用模型的名称,请使用以下命令:
$car[0].Model最后一行按价格对所有行进行排序,但它只是将该信息发送出管道。
因此,似乎您想要的是使用传递到脚本(制造商)中的参数,然后找到制造商拥有的最昂贵的模型。
有很多方法可以做到这一点,也有很多方法来构建这个结构,但是我将向您展示一种非常PowerShell的方法,使用管道和完整对象的功能。
取代你的第三行,我会做这样的事情:
$car |
Where-Object { $_.Manufacturer -eq $args[0] } |
Sort-Object Price -Descending |
Select-Object -ExpandProperty Model -First 1请注意,您可以在管道后断线,更容易阅读。
在这里,我将遍历行,筛选出制造商匹配的行,然后按价格进行排序(降序),然后取前1,只保留Model属性。
我建议使用正确的命名参数(as shown in Bacon Bits's answer),而不是使用$args。
https://stackoverflow.com/questions/47720328
复制相似问题