每行计算选项卡并返回包含太多选项卡的行

时间:2015-09-30 18:39:38

标签: powershell count

寻找PowerShell脚本,该脚本在文本文件中查找包含太多(或太少)标签的行。

我发现这个PowerShell脚本完全符合我的要求(差不多)。

这会计算每行标签的数量:

Get-Content test.txt | ForEach-Object { 
    ($_ | Select-String `t -all).matches | Measure-Object | Select-Object count
}

有人可以扩展/修改/重写这个,只返回每行有多个或少于X个标签的行(行号)?

2 个答案:

答案 0 :(得分:3)

在汇总到Get-Content之前不要使用Select-String,您将丢失有关每一行的相关信息。

相反,请将-Path参数与Select-String

一起使用
$Tabs = Select-String -Path .\test.txt -Pattern "`t" -AllMatches 
$Tabs |Select-Object LineNumber,Line,@{Name='TabCount';Expression={ $_.Matches.Count }}

要仅返回标签数量大于$x的广告,请使用Where-Object

$x = 3
$Tabs |Where-Object { $_.TabCount -ge $x} | Select-Object -ExpandProperty Line

如果您只想快速了解发布情况,还可以使用Group-Object

Get-Content .\test.txt | Group-Object { "{0} tabs" -f [regex]::Matches($_,"`t").Count } 

答案 1 :(得分:0)

有很多方法可以做到这一点。 Get-Content对我来说效果很好,我们创建了一个自定义对象,然后您可以根据需要进行过滤。

Get-Content test.txt | ForEach-Object{
    New-Object PSObject -Property @{
        Line = $_
        LineNumber = $_.ReadCount
        NumberofTabs =  [regex]::matches($_,"`t").count
    }
}

使用.net正则表达式方法计算返回的选项卡,并根据结果填充值。

NumberofTabs Number Line                                            
------------ ------ ----                                            
           8      1                 ;lkjasfdsa                      
           8      2                         asdfasdf                
           4      3          asdfasdfasdfa                          
           2      4  fasdfjasdlfjas;l              

现在,您可以根据需要使用PowerShell进行过滤。

} | Where-Object { $_.NumberofTabs -ne 4}

因此,如果4是完美数字,那么第3行将从结果中省略。