【问题标题】:Find lines in one Object based on strings in other object根据另一个对象中的字符串查找一个对象中的行
【发布时间】:2019-05-25 08:35:36
【问题描述】:

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

我有一个对象$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 } 

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

谁愿意帮助我?

【问题讨论】:

  • 如果您的对象是简单的字符串,那么您只需要在Where-Object.Where({}) 方法过滤器中使用-in-contains 运算符。像这样的东西...$1stCollection.Where({$_ -in $2ndCollection} 会给你第 1 个中的项目,这些项目也在第 2 个中。

标签: powershell powershell-v5.1 pattern-finding


【解决方案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-Object cmdlet 比较两个数组,然后使用-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

不匹配的不包括在内。

【讨论】:

  • 如果您将-ExcludeDifferent 附加到Compare-Object ,您可以删除|Where ... (+1)
  • @LotPings 你是对的,在这个假期吃完所有的圣诞食物之后,一定要把我的头埋在肩膀下:)。我已根据您的建议编辑了我的答案。
  • 谢谢@HenrikStanleyMortensen 我印象非常深刻。但恐怕我的规格不是 100% 清楚的。对此感到抱歉。 $A 是正确的,但 $B 更像是有时其中包含 $A 代码之一的行。 f.i. abced12350c7d3283-bec2-4db1-9078-ebb79d21afdf 更多文字。另一行 3a4d5g3f-gea1-4er2-1112-aeb22e3asdf 错误代码 even_more tekst。所以我喜欢只看到那些包含代码的行。
  • @marceluitnederland 我已经编辑了我的答案。您可以使用输出的对象附加到文件中,或者将它们收集到一个数组中,然后在您拥有整个数组时将它们全部添加到一个文件中。
  • 非常感谢@HenrikStanleyMortensen,你让第三个圣诞节过得很愉快。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 2015-11-20
  • 2011-11-26
  • 1970-01-01
  • 2021-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多