比较2个文本文件(仅比较特定的东西)

时间:2017-01-05 07:21:53

标签: powershell compare text-files

我正在处理收集数据的脚本。

我的文件A.txt看起来像这样:

PRS3152_1        00e0f4106f39 
EAQ3152_1        00E0F40E0A28 
POR3152_1        00E0F45E0AAB 
KLQ3152_1        00e0f4406e10
SWG3152_1        00e0f57Ae125

并且文件B.txt看起来像这样:

00E0F40E0A28 
00E0F45E0AAB
00e0f4406e10 
00e0f4106f39

如何检查A.txt中的MAC地址是否存在于A.txt中? 之后,脚本应该删除A.txt中不存在MAC地址的行。

2 个答案:

答案 0 :(得分:0)

$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

答案 1 :(得分:0)

请注意,我们通常不会回答您无法解决问题的任何代码/工作的问题。我这次做了一个例外,因为问题很简单,但不要指望这种情况经常发生。

将B.txt读入一个数组,然后检查该数组中每行A.txt的MAC地址,并将这些行只写回您匹配的文件:

# ForEach-Object and Where-Object are to remove whitespace and empty lines
$list = Get-Content 'C:\path\to\B.txt' |
        ForEach-Object { $_.Trim() } |
        Where-Object { $_ }

(Get-Content 'C:\path\to\A.txt') | Where-Object {
    $list -contains ($_ -split '\s+')[1]
} | Set-Content 'C:\path\to\A.txt'

Get-Content周围的括号是必需的,否则你将无法回写同一个文件(因为它仍在被读取)。