1

根据另一个文件中的行查找一个文件中的行。

我有一个对象$A,其中包含一些行,例如:

0c7d3283-bec2-4db1-9078-ebb79d21afdf
200bc957-26dd-4e8e-aa6e-00dc357c4ac2
218e0d2a-0e8b-4a68-8136-8f5dd749a614

我想在$B这些行的对象中找到匹配项,并将匹配项打印到输出文件中。

我已经尝试了一个星期(我在 powershell 的第一周:))我已经来到:

$F = $B | ForEach-Object{ $A | Select-String -Pattern $_$ -AllMatches| Select-Object line } 

但这并没有给我任何返回结果。

谁愿意帮助我?

4

1 回答 1

1

如果你想匹配你的第一个数组,并且应该匹配第二个数组中字符串的一部分,你可以执行以下代码:

$A = @("0c7d3283-bec2-4db1-9078-ebb79d21afdf", "200bc957-26dd-4e8e-aa6e-00dc357c4ac2", "218e0d2a-0e8b-4a68-8136-8f5dd749a614")

$B = @("Something 0c7d3283-bec2-4db1-9078-ebb79d21afdf", "Something else 200bc957-26dd-4e8e-aa6e-00dc357c4ac2", "Something also e3df3978-beb7-4545-bc48-ff40d8453be1")

foreach ($Line in $A) {
    if($B -match $Line) {
        $B | Where-Object {$_ -match $Line}
    }
}

我们首先遍历第一个对象中的所有行,然后比较该行是否与第二个数组中的任何内容匹配。如果我们找到匹配项,我们将通过数组 B 找到 A 中的 Line 匹配的位置。

你可以让这段代码更漂亮,但这是我能写出的最容易理解的方式。

旧答案
您可以使用Compare-Objectcmdlet 比较两个数组,然后使用-IncludeEqual开关显示匹配的位置,然后使用-ExcludeDifferent开关删除不匹配的结果。然后获取该输出并放入文件中。一个简单的测试可能是这样的:

$A = @("0c7d3283-bec2-4db1-9078-ebb79d21afdf", "200bc957-26dd-4e8e-aa6e-00dc357c4ac2", "218e0d2a-0e8b-4a68-8136-8f5dd749a614")

$B = @("0c7d3283-bec2-4db1-9078-ebb79d21afdf", "200bc957-26dd-4e8e-aa6e-00dc357c4ac2", "e3df3978-beb7-4545-bc48-ff40d8453be1")


(Compare-Object -ReferenceObject $A -DifferenceObject $B -ExcludeDifferent -IncludeEqual).InputObject | Out-File .\output.txt

这应该在您的 Shells 当前工作目录中输出一个文件,其中两个 GUID 匹配:

0c7d3283-bec2-4db1-9078-ebb79d21afdf
200bc957-26dd-4e8e-aa6e-00dc357c4ac2

不匹配的不包括在内。

于 2018-12-27T10:40:42.747 回答