You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对比原始与修改后文件,提取新增/修改内容并生成文件?

对比文件提取新增与修改行的解决方案

我有两个文件:原始数据文件(file1)和修改后的文件(file2),需要对比两者,生成仅包含新增行和修改行的结果文件,格式要求为Added : [行内容]和Modified : [修改后的行内容]。

示例文件

原始文件(file1)

Route table:
10.208.85.0/26 dev eth3 proto kernel scope link src 10.1.108.12
148.89.140.0/22 via 192.168.10.1 dev eth0
148.89.168.0/21 via 192.168.10.1 dev eth0
151.87.44.0/23 via 192.168.10.1 dev eth0
151.87.46.0/23 via 192.168.10.1 dev eth0
192.55.16.128/28 via 192.168.10.1 dev eth0
192.55.28.32/27 via 192.168.10.1 dev eth0
192.55.28.64/28 via 192.168.10.1 dev eth0
192.55.192.96/27 via 192.168.10.1 dev eth0
192.60.136.0/22 via 192.168.10.1 dev eth0
192.62.212.64/26 via 192.168.10.1 dev eth0

Disks:
Disk /dev/sda: 96 GiB, 103079215104 bytes, 201326592 sectors
/dev/sda1  *       2048   1060863   1058816  517M 83 Linux
/dev/sda2       1060864 201326591 200265728 95.5G 8e Linux LVM

修改后文件(file2)

Route table:
10.208.85.0/26 dev eth3 proto kernel scope link src 10.1.108.12
10.123.17.64/26 via 10.1.208.1 dev eth2
148.89.140.0/22 via 192.168.10.1 dev eth0
148.89.168.0/21 via 192.168.10.1 dev eth0
151.87.44.0/23 via 192.168.10.1 dev eth0
151.87.46.0/23 via 192.168.10.1 dev eth0
192.55.16.128/28 via 192.168.10.1 dev eth0
192.55.28.32/27 via 192.168.10.1 dev eth0
192.55.28.64/28 via 192.168.10.1 dev eth0
192.55.192.96/27 via 192.168.10.1 dev eth0
192.60.136.0/22 via 192.168.10.1 dev eth0
192.62.212.64/26 via 192.168.10.1 dev eth0

Disks:
Disk /dev/sda: 128 GiB, 137438953472 bytes, 201326592 sectors
/dev/sda1  *       2048   1060863   1058816  517M 83 Linux
/dev/sda2       1060864 201326591 200265728 95.5G 8e Linux LVM

期望输出结果

Added : 10.123.17.64/26 via 10.1.208.1 dev eth2
Modified : Disk /dev/sda: 128 GiB, 137438953472 bytes, 201326592 sectors

解决方案

方法1:Linux命令行组合(diff + awk)

适合Linux/Unix环境,直接用系统自带工具完成:

diff -u file1 file2 | awk '
    /^\+[^+]/ {
        if (prev_minus != "") {
            print "Modified : " substr($0, 2)
            prev_minus = ""
        } else {
            print "Added : " substr($0, 2)
        }
    }
    /^-[^-]/ { prev_minus = substr($0, 2) }
' > result.txt

说明:

  • diff -u生成统一格式的差异输出,包含新增(+开头)、删除(-开头)的行
  • awk逻辑:
    • 记录原始文件中被删除的行(-开头且不是---的行)
    • 遇到对应的新增行时,判定为修改行,输出Modified : ...
    • 无对应删除行的新增行,判定为新增行,输出Added : ...

方法2:Python脚本(跨平台)

适合需要跨平台支持或后续扩展逻辑的场景:

def compare_files(file1, file2, output_file):
    # 读取文件并过滤空行
    with open(file1, 'r') as f:
        lines1 = [line.rstrip('\n') for line in f if line.strip()]
    with open(file2, 'r') as f:
        lines2 = [line.rstrip('\n') for line in f if line.strip()]
    
    added = set(lines2) - set(lines1)
    modified = []
    
    # 逐行对比找修改行(排除已标记为新增的行)
    max_lines = max(len(lines1), len(lines2))
    for i in range(max_lines):
        l1 = lines1[i] if i < len(lines1) else ""
        l2 = lines2[i] if i < len(lines2) else ""
        if l1 != l2 and l2 not in added:
            modified.append(l2)
    
    # 写入结果
    with open(output_file, 'w') as f:
        for line in added:
            f.write(f"Added : {line}\n")
        for line in modified:
            f.write(f"Modified : {line}\n")

# 调用示例
compare_files("file1", "file2", "result.txt")

说明:

  • 先读取两个文件的非空行,避免空行干扰对比
  • 通过集合差集快速找出新增行
  • 逐行对比找出内容变更的行(排除新增行),判定为修改行
  • 按要求格式写入结果文件

内容的提问来源于stack exchange,提问作者vijayedm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:45:26