看起来While循环无法生成可在管道中继续的输出。我需要处理一个大型(几个GiB)的文件。在这个简单的例子中,我想提取第二个字段,按其排序,然后只获取唯一值。我对While循环和将事物推送到管道中有什么不理解吗?
在*NIX世界中,这将是一个简单的操作:
cut -d "," -f 2 rf.txt | sort | uniq
在PowerShell中,这并不是那么简单。 源数据。
PS C:\src\powershell> Get-Content .\rf.txt
these,1,there
lines,3,paragraphs
are,2,were
脚本。
PS C:\src\powershell> Get-Content .\rf.ps1
$sr = New-Object System.IO.StreamReader("$(Get-Location)\rf.txt")
while ($line = $sr.ReadLine()) {
Write-Verbose $line
$v = $line.split(',')[1]
Write-Output $v
} | sort
$sr.Close()
输出内容。
PS C:\src\powershell> .\rf.ps1
At C:\src\powershell\rf.ps1:7 char:3
+ } | sort
+ ~
An empty pipe element is not allowed.
+ CategoryInfo : ParserError: (:) [], ParseException
+ FullyQualifiedErrorId : EmptyPipeElement
Get-Content
(在未使用-Raw
开关的情况下调用时)不会将整个文件读入内存。如果您看到了这种行为,那很可能是因为您将其导入了Sort-Object
(sort
是后者的别名);请参阅我的答案以了解原因。 - briantistImport-Csv
命令会逐行读取文件,您不需要担心要单独使用Get-Content
命令。详见 https://technet.microsoft.com/library/2a767ced-0fc9-4896-a8f0-2c5bdee49910(v=wps.630).aspx。 - NasirSort-Object
,他就会遇到相同的“问题”。 - briantist