我有一个Powershell脚本,可以计算单词出现的次数。如何显示每个单词位于哪几行?

时间:2019-06-11 11:54:03

标签: powershell scripting

因此,此脚本计算单词在整个文件中出现的次数。
哪个效果很好。
现在,我需要它来显示4个字符以上的每个单词出现在哪些行上。 问题是我几乎没有脚本编写经验。

向AdminOfThings致谢,以向我提供当前代码!

Function AnalyseTo-Doc
{
    param ([Parameter(Mandatory=$true)][string]$Pad )

    New-Item C:\destination.txt -ItemType file
    $destination = "C:\destination.txt"
    $filecontents = Get-Content $Pad -Raw

    $words = ($filecontents | Select-String -Pattern "\b[A-Za-z]{4,}\b" -AllMatches).Matches.Value
    $words | Group-Object -NoElement | Foreach-Object {
        ("{0},{1}" -f $_.Count,$_.Name) | Add-Content -Path $destination
        }
}
AnalyseTo-Doc

3 个答案:

答案 0 :(得分:0)

如上所述,SO不是代码编写服务。下面,我将为您提供一个示例,说明如何解决您的问题:

$s = "aaa", "bbb", "ccc" 

$findings = $s | select-string "bbb" 

$valAndLinenumber = $findings | Select-Object @{ l="Value"; e={ $_.matches.value}}, linenumber, line

$valAndLinenumber

输出:

 Value LineNumber Line
  ----- ---------- ----
  bbb            2 bbb

使它与脚本一起使用的适应权取决于您。

您可以在此link下找到示例。

进一步阅读:

希望有帮助。

答案 1 :(得分:0)

以下修改应该可以实现您想要的。

Function AnalyseTo-Doc
{
    param ([Parameter(Mandatory=$true)][string]$Pad )

    New-Item C:\destination.txt -ItemType file
    $destination = "C:\destination.txt"
    $filecontents = Get-Content $Pad

    $words = $filecontents | Select-String -Pattern "\b[A-Za-z]{4,}\b" -AllMatches
    $group = $words.Matches.Value | Group-Object -NoElement
    $output = foreach ($word in $group) {
        [pscustomobject]@{Count = $Word.Count
                Word = $word.Name
                Linenumbers = $words.where{$_.Matches.Value -eq $word.Name}.linenumber
              }
    }
    $output | Foreach-Object {
    ("{0},{1},{2}" -f $_.Count,$_.Word,($_.Linenumbers -Join " ")) | Add-Content -Path $Destination
    }

}

行号在输出文件中每行末尾加一个空格。您可以通过更新-Join " "部分来更改连接字符。

答案 2 :(得分:0)

正如AnsgarWiechers所暗示的那样,Select-String返回的结构化对象具有每行匹配项。

## 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)文件中。