0

我正在搜索文本文件 (*.sql) 的集合,以查找以 9 开​​头的 8 位数字。文件中可能有这些数字的多个实例,并且文件中的每一行都有多个实例。我只希望输出显示每个文件中每个 8 位数字的唯一出现。这是我到目前为止所拥有的:

Select-String "9[0-9]{8}" "*.sql" -AllMatches | Select-Object FileName, @{N="Value";E={ $_.matches |  %{$_.groups[0].value}}} | Select-Object  -unique FileName,Value  

我的输出如下所示:

FileName                       Value
--------                       -----

File1.sql                      907520714
File1.sql                      {907500507, 907520700, 907520701, 907520703...} 
File1.sql                      {907520725, 907520727, 907520728, 907520729} 
File1.sql                      990140600
File2.sql                      990319161
File2.sql                      {990603919, 990603925, 990603926} 
File2.sql                      {991100103, 991100103}
File2.sql                      {990700023, 990700504, 990700521, 990740520...} 
File3.sql                      907500044

ETC....

我想做的是扩展数组,这样当我通过 select -unique 管道时,我实际上只会得到每个文件中包含的唯一 8 位数字。

这就是我想要的:

FileName                       Value
--------                       -----

File1.sql                      907520714
File1.sql                      907500507
File1.sql                      907520700
File1.sql                      907520701
File1.sql                      907520703 
File1.sql                      907520725
File1.sql                      907520727
File1.sql                      907520728
File1.sql                      907520729 
File1.sql                      990140600
File2.sql                      990319161
File2.sql                      990603919
File2.sql                      990603925
File2.sql                      990603926 
File2.sql                      991100103
File2.sql                      990700023
File2.sql                      990700504
File2.sql                      990700521
File2.sql                      990740520 
File3.sql                      907500044

ETC...

我怎样才能做到这一点?我当前的 powershell 命令可以改进吗?

谢谢!

4

2 回答 2

0

好吧,主要是用掉你所拥有的,有点。我正在对 Select-String 找到的所有匹配项执行 ForEach 循环,并按文件名对它们进行分组。然后对于每个文件,我遍历扩展匹配的组,然后只为匹配的文本获取唯一值。对于每个值,我输出一个包含文件名和匹配值的对象。

ForEach($File in Select-String "9[0-9]{8}" "*.sql" -AllMatches | Group FileName){
    $File.group|select -expand matches|Select Value -Unique|%{
        new-object PSObject -property @{
            FileName=$File.Name
            Match=$_.value
        }
    }
}
于 2014-05-15T17:45:58.860 回答
0

我重新格式化了命令,我认为 PowerShell 简写的简洁性使得更难发现问题。

Select-String "9[0-9]{8}" "*.sql" -AllMatches | `
    Select-Object FileName, @{N="Value";E={ $_.matches | %{$_.groups[0].value}}} | `
    Select-Object  -unique FileName,Value 

您的原始命令为 Select-String 返回的每个 MatchInfo 生成一个输出行。MatchInfo 表示文本文件的匹配行。我相信当文件中的一行包含多个匹配值时,您将获得一组值。

我对其进行了修改以澄清我们希望每个 MatchInfo 中的每个 RegexMatch 都有一个输出对象,也就是说每个匹配值都有一个输出对象。

Select-String "9[0-9]{8}" "*.sql" -AllMatches | `
    Foreach-Object { 
        # $_ is MatchInfo for each matching line in file
        $fileName = $_.FileName 
        $_.Matches | Foreach-Object { 
            # $_ is RegexMatch for each match in line
            $_ | Select-Object -Property @{N="FileName";E={$fileName} },Value
        } 
    } | Select-Object  -unique FileName,Value 
于 2014-05-15T18:09:44.797 回答