首页 > 解决方案 > 比较 2 个文件中的字段并仅写入缺失或不同的字段

问题描述

我准备了 2 个 LDIF 输出到一行,每个对象用“|”分隔 并且所有属性字段都已排序。我想写第一个字段包含 dn:当字段丢失或在第二个文件中具有不同的值时。如果它丢失了,我需要一个标记添加和一个标记替换,如果它不同的话。如果所有字段都相同,则不应写入任何内容。我的带有 2 个循环的脚本可以工作,但是会减慢数百万行。我现在正在用 awk 尝试这个,但我不知道如何将 2 个文件与它进行比较。

文件 1

dn:abc|attribut a: 10|attribut b: 11|attribut c: 12
dn:xyz|attribut a: 10|attribut b: 11|attribut c: 12

文件 2

dn:abc|attribut a: 10|attribut b: 11|attribut c: 12
dn:xyz|attribut a: 10|attribut c: 11

需要的输出

dn:xyz|add attribute b: 11|replace attribute c: 12

带有 dn:abc 的行在两个文件中是相同的,因此它没有写入输出文件。dn:xyz 行有区别,所以我需要第一个字段包含“dn:xyz”。下一个字段属性 a: 10 是相同的,所以什么都不做。文件 2 中缺少下一个字段,我需要“添加属性 b:11”。最后一个字段属性 c:在两个文件中,但文件 2 中的值不同,我需要“替换属性 c:12”文件 1 中的值。

标签: awk

解决方案


这不是问题的直接答案,但是,从评论看来,要比较的文件似乎是从标准 LDIF 格式的文件创建的。

已经存在用于获取两个 LDIF 文件并输出协调它们所需的更改的工具。例如:

  • OpenDJldifdiff在其opendj-ldap-toolkit软件包中提供
  • ldifdiff是一个 Go 工具
  • ldiff是一个未维护的 Perl 脚本,用于“在两个 LDIF 文件之间生成差异”
  • ldap-diff - 另一个 Perl 脚本

其中一种工具可能比从头开始的新工具更可靠。

一些关于 LDIF 的背景资料,包括变更记录:


推荐阅读