比较文本文件。记录匹配的行#

时间:2018-01-09 20:12:34

标签: powershell compare line-numbers

我有两个文本文件。

$File1 = "C:\Content1.txt"
$File2 = "C:\Content2.txt"

我想比较这些以查看它们是否具有相同数量的行,然后我想记录匹配的每行的行号。我意识到这听起来很荒谬,但这是我在工作中被要求做的事情。

我可以通过很多方式比较它们。我决定做以下事情:

$File1Lines = Get-Content $File1 | Measure-Object -Line
$File2Lines = Get-Content $File2 | Measure-Object -Line

我想用if语句测试它,这样如果它们不匹配,那么我可以重新开始一个早期的过程。

if ($file1lines.lines -eq $file2lines.lines) 
{ Get the Line #s that match and proceed to the next step} 
else {Start Over}

我不确定如何记录匹配的行#。有关如何做到这一点的任何想法?

2 个答案:

答案 0 :(得分:3)

这非常简单,因为Get-Content以字符串数组的形式读取文件,你可以简单地索引该数组。

Do{
    <stuff to generate files>
}While(($File1 = GC $PathToFile1).Count -ne ($File2 = GC $PathToFile2).count)

$MatchingLineNumbers = 0..($File1.count -1) | Where{$File1[$_] -eq $File2[$_]}

由于PowerShell中的数组使用基于0的索引,我们希望从0开始,然后使用文件所包含的许多行。由于.count从1开始而不是0,我们需要从总计数中减去1。因此,如果您的文件有27行$File1.count将等于27.这些行的索引范围从0(第一行)到26(最后一行)。代码($File1.count - 1)实际上会达到26,因此0..26从0开始,计为26。

然后每个数字都转到Where语句,该语句检查每个文件中的特定行以查看它们是否相等。如果是,那么它会传递数字,并在$MatchingLineNumbers中收集。如果行不匹配,则不传递数字。

答案 1 :(得分:0)

首先需要获得一个交叉点,然后找到索引。

FILE1.TXT

Line1
Line2
Line3
Line11
Line21
Line31
Line12
Line22
Line32

FILE2.TXT

Line1
Line11
Line21
Line31
Line12
Line222
Line323
Line214
Line315
Line12
Line22
Line32

<强> test.ps1

$file1 = Get-Content file1.txt
$file2 = Get-Content file2.txt
$matchingLines = $file1 | ? { $file2 -contains $_ }

$file1Lines = $matchingLines | % { Write-Host "$([array]::IndexOf($file1, $_))"  }
$file2Lines = $matchingLines | % { Write-Host "$([array]::IndexOf($file2, $_))"  }

<强>输出

$ file1Lines

    0
    3
    4
    5
    6
    7
    8

$ file2Lines

    0
    1
    2
    3
    4
    10
    11