这主要是一个方法/概念问题,我感谢你提出的任何意见。
问题:
我经常需要比较和编辑属性文件,这样做我主要想找到新文件中存在的新属性与旧文件相比。为了达到这个目的,我经常使用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脚本有效地实现这一目标?
谢谢,
答案 0 :(得分:4)
GNU代码awk:
awk -F= 'NR==FNR {a[$1]++;next}; !a[$1] {print $1, "line", FNR}' fileOld fileNew
答案 1 :(得分:2)
作为@ mob的答案的另一种选择,并提供其他一些可能性:
显示已在new_file中删除的属性
comm -23 <(cut -d= -f1 old_file) <(cut -d= -f1 new_file)
显示已在new_file中添加的属性
comm -13 <(cut -d= -f1 old_file) <(cut -d= -f1 new_file)
显示两个文件中的常用属性
comm -22 <(cut -d= -f1 old_file) <(cut -d= -f1 new_file)
答案 2 :(得分:1)
您可以使用cut
忽略每行第一个=
后的任何输入:
diff <(cut -d= -f1 old_file) <(cut -d= -f1 new_file)
预计输出:
22a23
> external.port