用于匹配和替换部分匹配模式的Powershell

汉娜香蕉

整周发疯,无法解决这个问题。我有一个字典单词文件,一次将有几百万个单词,现在让我们假设它只是一个文本文件“ Words.txt”,其具有:

应用程序
的苹果
应用程序
蝙蝠
连击
资本
糖果

我需要做的是将每个字符串与文件的其余部分进行匹配,并且仅写入第一个匹配项的输出。这将是字母顺序的。

例如,上述单词的期望输出为:

应用-由于首先显示模式“ App”而跳过“ Apple”和“应用
栏”-由于模式“ Bar”,唯一的
蝙蝠-由于模式“ Bat”首先显示而跳过“击球员”
帽-由于模式首先出现“帽子”,而跳过“首都”
糖果-由于图案“糖果”的独特性

我绝对不能弄清楚该怎么做,就是如何忽略最初击中后发生的匹配并转为“新”模式。如果其他冗余模式被覆盖或被跳过,则没关系,这没关系。

我有一个匹配模式的脚本,但我不知道如何以所需的输出结束:(有帮助吗?!?!


$Words = "C:\Words.txt"

[System.Collections.ArrayList]$WordList = Get-Content $Words

$Words
$Words2 = $Words
$i = 0
$r = 0
Foreach ($item in $Words)
{
    foreach ($item2 in $Words2)
    {
            if ($item2 -like "$item*")
            {
            write-host $("Match " + [string]$i + " " + $item + " " + [string]$r + " " + $item2)
            }

            $r++
    }
$i++
} 
mklement0

一行一行地处理并将它们与最新的唯一前缀进行比较就足够了:

$prefix = '' # initialize the prefix pattern
foreach ($line in [IO.File]::ReadLines('C:\Words.txt')) {
  if ($line -like $prefix) { continue } # same prefix, skip
  $line               # output new unique prefix
  $prefix = "$line*"  # save new prefix pattern
}

注意:由于您提到输入文件很大,因此,我使用System.IO.File.ReadLines而不是Get-Content读取文件是为了获得卓越的性能。

注意:无论如何,示例输入路径都是完整路径,但是请确保始终将完整路径传递给.NET方法,因为.NET的工作目录通常不同于PowerShell的工作目录。

如果包装foreach循环& { ... },则可以以流方式(逐行,而不先收集所有结果在内存中)将结果传递给Set-Content

但是,使用.NET类型进行保存也会有更好的效果-请参见此答案的底部

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章