根据另一个文件中的行在一个文件中查找行。
我有一个对象$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 }
但这不会给我任何返回结果。
谁愿意帮助我?
答案 0 :(得分: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所在的行匹配的位置。
您可以使这段代码更漂亮,但这是我编写它的最容易理解的方式。
旧答案
您可以使用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
不包含不匹配项的地方。