Как намекнул AnsgarWiechers, Select-String возвращает структурированный объект с Matches per Lines.
## Q:\Test\2019\06\11\SO_56543125.ps1
Function AnalyseTo-Doc{
param ([Parameter(Mandatory=$true)][string]$Pad )
$Lines = Select-String -Path $Pad -Pattern '\b[A-Za-z]{4,}\b' -AllMatches
$Words = ForEach($Line in $Lines){
ForEach($Match in $Line.Matches){
[PSCustomObject]@{
LineNumber = $Line.LineNumber
Word = $Match.Value
}
}
}
$Words | Group-Object Word | ForEach-Object {
[PSCustomObject]@{
Count= $_.Count
Word = $_.Name
Line = $_.Group.LineNumber -join ','
}
}
}
AnalyseTo-Doc Question_SO_56543125.txt
С текстом вопроса в файле Question_SO_56543125.txt
скрипт возвращает:
> Q:\Test\2019\06\11\SO_56543125.ps1
Count Word Line
----- ---- ----
1 this 1
1 script 1
1 counts 1
1 many 1
1 times 1
1 words 1
1 appear 1
1 whole 1
1 file 1
2 Which 2,3
1 works 2
...snip...
Выходные данные могут быть легко сохранены в (CSV) файл.