比较文本文件。记录匹配的行号
Compare Text Files. Record Line #s that Match
我有两个文本文件。
$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}
我不确定如何记录匹配的#s 行。关于如何做到这一点有什么想法吗?
你需要先得到一个交集,然后找到索引。
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
测试.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, $_))" }
输出
$file1行
0
3
4
5
6
7
8
$file2Lines
0
1
2
3
4
10
11
这真的很简单,因为 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
中收集。如果行不匹配,则不会传递数字。
我有两个文本文件。
$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}
我不确定如何记录匹配的#s 行。关于如何做到这一点有什么想法吗?
你需要先得到一个交集,然后找到索引。
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
测试.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, $_))" }
输出
$file1行
0
3
4
5
6
7
8
$file2Lines
0
1
2
3
4
10
11
这真的很简单,因为 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
中收集。如果行不匹配,则不会传递数字。