我有一个powershell脚本可以计算单词出现的次数,我怎么才能显示每个单词位于哪一行呢?

ha5z0ras  于 2023-01-30  发布在  Shell
关注(0)|答案(3)|浏览(114)

所以这个脚本计算单词在整个文件中出现的次数。
效果很好。
现在,我需要它来显示哪些行每个字以上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
cvxl0en2

cvxl0en21#

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

ncecgwcz

ncecgwcz2#

下面的修改应该能达到你的目的。

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 " "部分来更改连接字符。

eeq64g8w

eeq64g8w3#

下面我会给你一个例子,你的问题可以解决:

$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

改编使其与您的脚本一起工作取决于您。
您可以在此链接下找到示例。
进一步阅读:

相关问题