比较两个文件并替换其中一个文件中的字符串

时间:2016-07-28 18:37:11

标签: powershell

我正在寻找使用其他文件中的字符串替换一个文件中的一个字符串的解决方案。

假设我有两个txt文件:

file1

serial_1 serialN1
serial_2 serialN2

file2的

something serial_3 serialN1
something serial_4 serialN2

我希望将serial_3替换为serial_1,将serial_4替换为serial_2

所以我想从file2搜索file1第二列(serialN)中的数字,并在serialN匹配第一个文件中的条目时替换file2中的“领先”序列号。< / p>

到目前为止我在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]
        }
    }
}

这很好用,现在我想在$serial_source中用$serial_destination代替file2。怎么做?

1 个答案:

答案 0 :(得分: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已经尝试覆盖它的管道末尾打开以读取其内容。

最后注意:上述方法可能会更改您的文件编码,因此您可能需要在必要时进行调整。