在PowerShell脚本达到三次后停止计数

时间:2014-09-25 21:20:19

标签: powershell

我有一个脚本可以计算某个单词在文件中出现的次数。随着文件,它不断添加单词,每次powershell都要计算出现次数。但是我希望它一旦被识别出一个特定的单词被添加三次就停止计数,例如:

苹果 苹果 苹果 香蕉 香蕉 苹果

我希望它一旦被识别的苹果停止计数3次而不算数为4.这是我使用的powershell脚本:

    $ht=@{}
$Output=switch(gc c:\temp\LimitCount.txt){ {($ht.values|sort -Descending|select -first 1) -eq 3}{break}
 {$_ -match '^. +user:(.+)$' -and [string]::IsNullOrEmpty($ht.(([regex]"^(?:. +user:)(.+)$").matches($_).groups[1].value))}{$ht.(([regex]"^(?:. +user:)(.+)$").matches($_).groups   [1].value)=0}
 {$_ -match '^. +user:(.+)$' -and $ht.(([regex]"^(?:. +user:)(.+)$").matches($_).groups[1].value) -eq 3}{continue}
{$_ -match '^. +user:(.+)$'}{$ht.(([regex]"^(?:. +user:)(.+)$").matches($_).groups[1].value)++;([regex]"^(?:. +user:)(.+)$").matches($_).groups[1].value;continue}
 default {$_}
}
"Unfiltered results and count:"
$output|group -NoElement
$output|Where{$ht.keys -contains $_}|group -NoElement

1 个答案:

答案 0 :(得分:2)

所以你没有回复我的评论,但我们假设你想要的任何一场比赛不超过3。我要做的是创建一个空的哈希表,并对文件的内容运行一个Switch命令并将结果捕获到一个数组中

第一个验证将检查字符串是否与正则表达式匹配,以及匹配的文本是否已在哈希表中。如果匹配,并且不在哈希表中,则将其添加到哈希表中。

第二个验证检查字符串是否与正则表达式匹配,以及哈希表条目是否等于3.如果是,则跳转到文本文件的下一行。

第三个验证只是检查字符串是否与正则表达式匹配,如果是,则将该匹配的哈希表条目递增1,并传递匹配的文本。

第四次验证是默认验证,如果没有其他验证发生,那么它只是将未经修改的行传递给它。

然后你可以输出那个数组,或者仅为符合你的正则表达式的东西过滤它。代码看起来像这样:

$ht=@{}
$Output=switch(gc c:\temp\test.txt){
    {$_ -match '^. +user:(.+)$' -and [string]::IsNullOrEmpty($ht.(([regex]"^(?:. +user:)(.+)$").matches($_).groups[1].value))}{$ht.(([regex]"^(?:. +user:)(.+)$").matches($_).groups[1].value)=0}
    {$_ -match '^. +user:(.+)$' -and $ht.(([regex]"^(?:. +user:)(.+)$").matches($_).groups[1].value) -eq 3}{continue}
    {$_ -match '^. +user:(.+)$'}{$ht.(([regex]"^(?:. +user:)(.+)$").matches($_).groups[1].value)++;([regex]"^(?:. +user:)(.+)$").matches($_).groups[1].value;continue}
    default {$_}
}
"Unfiltered results and count:"
$output|group -NoElement
"Filtered for only matched items:"
$output|Where{$ht.keys -contains $_}|group -NoElement

给出输入:

A user:Apple
A user:Apple
A user:Banana
Shiney tacos!
A user:Orange
A user:Banana
A user:Apple
A user:Orange
A user:Orange
A user:Apple
A user:Apple
A user:Apple
A user:Apple
A user:Apple

您得到的输出为:

Unfiltered results and count:
Count Name                     
----- ----                     
    3 Apple                    
    2 Banana                   
    1 Shiney tacos!            
    3 Orange                   
Filtered for only matched items:
    3 Apple                    
    2 Banana                   
    3 Orange

如果您想在任何匹配中达到3时停止,您可以在第一次验证之前立即添加以下行:

    {($ht.values|sort -Descending|select -first 1) -eq 3}{break}