2016-02-24 140 views
0

我是一個新的使用PowerShell的。在這裏我有一個任務來比較兩個文件。文件格式是這樣的:Powershell比較文件

文件a.txt中

20160222|LineA 
20160222|LineB 
20160222|LineC 

文件B.txt

20160223|LineE 
20160223|LineA 
20160223|LineD 
20160223|LineB 
20130223|LineC 

比較之後,我想找出

20160223|LineE 
20160223|LineD 

爲第三輸出文件。

我該怎麼做?

+0

它看起來像壓縮日期值在比較過程中被忽略,這是真的嗎? – Cobster

+0

是的,你是對的! – Leo

回答

3

好了,所以這是一個有點令人費解,但會完成這項工作。

# Split the date and value, but keep the raw value intact 
$fileA = Get-Content .\fileA.txt | Select-Object -Property @{ Name="Value"; Expression={ $_.Substring($_.IndexOf("|")+1) }}, @{ Name="Raw"; Expression={ $_ }} 
$fileB = Get-Content .\fileB.txt | Select-Object -Property @{ Name="Value"; Expression={ $_.Substring($_.IndexOf("|")+1) }}, @{ Name="Raw"; Expression={ $_ }} 

# Find the differences, should contain LineE and LineD 
$diffs = Compare-Object -ReferenceObject $fileA -DifferenceObject $fileB -Property Value | Select-Object -Expand Value 

# Match the diffs against original content and pull out the raw values 
$fileB | Where-Object { $diffs -contains $_.Value } | Select-Object -Expand Raw 
+0

在前兩行中引發錯誤: 「ExpandProperty」需要System.String,$ fileA是System.Object [] – Martin

+0

但是如果每行還包含分隔符「|」會怎麼樣?例如Line A = LineA1 | LineA2,LineB = LineB1 | LineB2等。我怎樣才能找出20160223 | LineD1 | lineD2和20160223 | LineE1 | lineE2 – Leo

+0

已更新爲初始分割'|' – Cobster

1

那更像期望的結果:

$a = Import-Csv .\a.txt -Delimiter "|" -Header 'no', 'line' 
$b = Import-Csv .\b.txt -Delimiter "|" -Header 'no', 'line' 

$c = Compare-Object -ReferenceObject $a -DifferenceObject $b -Property line 


$z [email protected]() 
foreach ($d in $c) 
{ 
    if ($d.SideIndicator -eq "=>") 
    { 
     $z += $b | ?{$_.line -eq $d.line} 
    } 
    else # <= 
    { 
     $z +=$a | ?{$_.line -eq $d.line} 
    } 
} 

結果:

$z | % { write-host "$($_.no)|$($_.line)"} 
20160223|LineE 
20160223|LineD 
+0

你說得對,會過度勞累它。 – Martin

+0

結果不是LineD和LineE。 – Leo

+0

現在編輯。 – Martin