我正在处理一个收集数据的脚本。
我有文件A.txt看起来像这样:
PRS3152_1 00e0f4106f39EAQ3152_1 00E0F40E0A28POR3152_1 00E0F45E0AABKLQ3152_1 00e0f4406e10SWG3152_1 00e0f57Ae125
文件B.txt如下所示:
00E0F40E0A2800E0F45E0AAB00e0f4406e1000e0f4106f39
如何检查 B.txt 的 MAC 地址是否存在于 A.txt?之后,脚本应删除 A.txt 中不存在 MAC 地址的行。
$content1 = Get-Content "D:B.txt"
$content2 = Get-Content "D:A.txt"
$useFile = "D:%%%%%useFile%%%%%.txt"
$doesntexist = $true
foreach($line in $content2)
{
$doesntexist = $true
$lineCut = $line.Remove(0,17)
foreach($line2 in $content1)
{
if($lineCut -like $line2)
{
$doesntexist = $false
}
}
if($doesntexist -eq $false)
{
Add-Content $useFile $line
}
}
Remove-Item "D:A.txt"
Rename-Item "D:%%%%%useFile%%%%%.txt" "A.txt"
在一点帮助下,我设法解决了它。但无论如何谢谢你<3
请注意,我们通常不会回答没有显示您解决问题的任何代码/努力的问题。这次我破例了,因为这个问题很简单,但不要指望这种情况经常发生。
将 B.txt 读入数组,然后对照该阵列检查 A.txt 的每一行的 MAC 地址,并仅将这些行写回具有匹配项的文件:
# ForEach-Object and Where-Object are to remove whitespace and empty lines
$list = Get-Content 'C:pathtoB.txt' |
ForEach-Object { $_.Trim() } |
Where-Object { $_ }
(Get-Content 'C:pathtoA.txt') | Where-Object {
$list -contains ($_ -split 's+')[1]
} | Set-Content 'C:pathtoA.txt'
Get-Content
两边的括号是必需的,否则您将无法写回同一文件(因为它仍在读取)。