У меня есть скрипт PowerShell, который подсчитывает, сколько раз появляются слова.Как я могу показать, на каких строках находится каждое слово? - PullRequest
0 голосов
/ 11 июня 2019

Таким образом, этот скрипт подсчитывает, сколько раз слова появляются во всем файле.
Что отлично работает.
Теперь мне нужно, чтобы он показал, в каких строках появляется каждое слово выше 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 голосов
/ 11 июня 2019

Следующие модификации должны достичь того, что вы хотите.

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 " ".

0 голосов
/ 11 июня 2019

Как намекнул 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) файл.

0 голосов
/ 11 июня 2019

Как указано в комментарии выше, 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

Адаптация, чтобы он работал с вашим сценарием, зависит от вас.

Вы можете найти пример по этой ссылке .

Дальнейшее чтение:

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...