如何对比原始与修改后文件,提取新增/修改内容并生成文件?
对比文件提取新增与修改行的解决方案
我有两个文件:原始数据文件(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
相关产品推荐
相关产品推荐

