2016-07-28 63 views
1

我正在尋找解決方案,以從其他文件中的字符串替換一個文件中的一個字符串。比較兩個文件,並將其中一個替換字符串

比方說,我有2個txt文件:

文件1

serial_1 serialN1 
serial_2 serialN2 

文件2

something serial_3 serialN1 
something serial_4 serialN2 

我希望得到的是serial_1取代serial_3,和serial_4serial_2

所以我想從file1從第二列(serialN)號搜索file2file2取代「龍頭」的序列號時,從第一個文件serialN匹配條目。

我有什麼至今在PowerShell中:

$source = Get-Content file1 
foreach ($line in $source){ 
    $position_source = ($line.Split())[1] 
    $serial_source = ($line.split())[0] 
    $destination = Get-Content file2 
    foreach ($destination_line in $destination){ 
     $position_destination = ($destination_line.Split())[2] 
     if ($position_destination -eq $position_source){ 
      $serial_destination = ($destination_line.Split())[1] 
     } 
    } 
} 

而且這工作得很好,現在我想在file2$serial_source代替$serial_destination。怎麼做?

回答

1

你可能想嘗試這樣的事情

$replacementDict = @{} 
$sourceLines = Get-Content file1 
foreach ($line in $sourceLines) { 
    $parts = $line.Split() 
    $position = $parts[1] 
    $serial = $parts[0] 
    $replacementDict.Add($position, $serial) 
} 

(Get-Content file2) | 
    % { 
     $parts = $_.Split() 
     $position = $parts[2] 
     if ($replacementDict.($position)) { 
      $parts[1] = $replacementDict.$position 
     } 
     $parts -join ' ' 
    } | Set-Content -Encoding UTF8 file2 

在您最初的代碼中,你讀了第二個文件多次(一次的file1每行)浪費了資源,並且也可能會導致覆蓋file2多次,當這將實施。
上面的代碼首先創建一個file1的字典/散列表,它將'位置'映射到連續字符,然後在第二部分中file2的內容被替換,如果在該字典/散列表中找到'位置'。所以這兩個文件只能讀取一次。

請注意在Get-Content file2附近的附加括號,以確保一次讀取文件,並且只有在通過管道傳輸文件內容後才能讀取文件,否則file2仍然可以讀取其內容,而與Set-Content管道的末端已經嘗試覆蓋它。

最後說明:上述方法可能會更改您的文件編碼,因此您可能需要在必要時進行調整。

+0

嗨, 是的,這是非常好的解決方案。非常感謝你! –