2

这主要是一个方法/概念问题,我感谢您可能有的任何意见。

问题:我经常需要比较和编辑一个属性文件,这样做我主要感兴趣的是找到与旧文件相比新文件中存在的新属性。为了实现这一点,我经常使用diff old_file.prop new_file.prop,但由于每个文件中的行数/属性(~150)很多,这种方法效率不高,而且容易出错。

样品old_file.prop

name.host=mycomputer1
internal.port=21
external.gateway=sample.my.machine

样品new_file.prop

name.host=change_me
internal.port=21
external.gateway=change_me
external.port=501

这里diff命令将返回:

<name.host=mycomputer1
<external.gateway=sample.my.machine
>name.host=change_me
>externa.gateway=change_me
>external.port=501

在这个例子中,唯一感兴趣/想要的输出是external.port而不是它持有的值(也许还有一个行号)。我有点熟悉sed,但我认为如果不事先了解新文件中的属性,它就无法做到这一点。

有没有办法使用 bash 脚本有效地实现这一点?

谢谢,

4

3 回答 3

4

GNU 的代码:

awk -F= 'NR==FNR {a[$1]++;next}; !a[$1] {print $1, "line", FNR}' fileOld fileNew
于 2013-07-08T21:38:44.650 回答
2

作为@mob答案的替代方案,并提供其他一些可能性:

  1. 显示已在 new_file 中删除的属性

    comm -23 <(cut -d= -f1 old_file) <(cut -d= -f1 new_file)

  2. 显示已添加到 new_file 中的属性

    comm -13 <(cut -d= -f1 old_file) <(cut -d= -f1 new_file)

  3. 显示两个文件中的共同属性

    comm -22 <(cut -d= -f1 old_file) <(cut -d= -f1 new_file)

于 2013-07-08T21:39:23.047 回答
1

您可以使用cut忽略=每行第一个之后的任何输入:

diff <(cut -d= -f1 old_file) <(cut -d= -f1 new_file)

预计输出:

22a23
> external.port
于 2013-07-08T21:14:55.423 回答