我有一个脚本可以计算某个单词在文件中出现的次数。随着文件,它不断添加单词,每次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
答案 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}