需求:比較兩個(gè)文本文件,不相等時(shí)輸出行號(hào)和列號(hào),和開始不相等的字符。
方法一:Compare-Object
利用PowerShell命令Compare-Object,非常值得學(xué)習(xí)。
復(fù)制代碼 代碼如下:
function Compare-Files{
param(
$file1,
$file2,
[switch]$IncludeEqual
)
$content1 = Get-Content $file1
$content2 = Get-Content $file2
$comparedLines = Compare-Object $content1 $content2 -IncludeEqual:$IncludeEqual |
group { $_.InputObject.ReadCount } | sort Name
$comparedLines | foreach {
$curr=$_
switch ($_.Group[0].SideIndicator){
“==” { $right=$left = $curr.Group[0].InputObject;break}
“=>” { $right,$left = $curr.Group[0].InputObject,$curr.Group[1].InputObject;break }
“=" { $right,$left = $curr.Group[1].InputObject,$curr.Group[0].InputObject;break }
}
[PSCustomObject] @{
Line = $_.Name
Left = $left
Right = $right
}
}
}
方法二,使用流處理比較
解釋:沒有使用內(nèi)置的string相等比較,而是定義了函數(shù) Diff-String,可以返回字符串首次不相等時(shí)的索引。
復(fù)制代碼 代碼如下:
function Diff-Txt([io.fileinfo]$firstFile,[io.fileinfo]$secondFile)
{
#參數(shù)判斷
if( -not $firstFile.Exists)
{
throw "$firstFile 不存在"
}
if( -not $secondFile.Exists)
{
throw "$secondFile 不存在"
}
$sr1=[IO.StreamReader]$firstFile.FullName
$sr2=[IO.StreamReader]$secondFile.FullName
#內(nèi)部函數(shù):比較字符串
#返回-1表示相等,返回其它表示從$str1開始不等的索引
function Diff-String([string]$str1,[string]$str2)
{
for( $i=0; $i -lt $str1.Length; $i++)
{
if($i -lt $str2.Length)
{
if($str1[$i] -cne $str2[$i]){ return $i }
}
else { return $i }
}
if($str2.Length -gt $i ) { return $i }
return -1
}
# firstFile 沒到文件末尾
$line=1
while(-not $sr1.EndOfStream)
{
$str1 = $sr1.ReadLine()
# secondFile 到了文件末尾
if($sr2.EndOfStream)
{
Write-Host "=> [$line 行,1 列]"
}
# secondFile 沒到文件末尾
else
{
$str2 = $sr2.ReadLine()
$result = Diff-String -str1 $str1 -str2 $str2
if($result -ne -1)
{
Write-Host "> [$line 行,$result 列] 字符->" -NoNewline
Write-Host $str1[$result] -ForegroundColor red
}
}
$line++
}
# 第二個(gè)文件沒到文件末尾
while( -not $sr2.EndOfStream)
{
$str2 = $sr2.ReadLine()
Write-Host "= [$line 行,1 列]"
}
# 關(guān)閉文件流
$sr1.Close()
$sr2.Close()
}
測試用例一
輸入
第一個(gè)文件內(nèi)容為:
復(fù)制代碼 代碼如下:
PowerShell
中文博客
jb51.net
荔非苔
第二個(gè)文件內(nèi)容為:
復(fù)制代碼 代碼如下:
PowerShell
中文播客
jb51.Net
荔非苔
Mosser Lee
輸出:
測試用例二
輸入
第一個(gè)文件內(nèi)容為:
復(fù)制代碼 代碼如下:
玉樹臨風(fēng)
馬上伊利
文章做作
第二個(gè)文件內(nèi)容為:
復(fù)制代碼 代碼如下:
玉樹臨瘋
輸出:
文章出處:http://www.pstips.net/
您可能感興趣的文章:- Shell腳本對(duì)比兩個(gè)文本文件找出不同行的2個(gè)方法分享
- PowerShell讀取文本文件指定行內(nèi)容的方法
- Shell腳本逐行讀取文本文件(不改變文本格式)
- Powershell實(shí)現(xiàn)加密解密文本文件方法實(shí)例
- shell文件處理筆記之插入文本到文件的方法