比较两个属性文件并替换值

时间:2016-04-06 21:44:33

标签: shell unix

我有两个文件File_A和File_B包含键/值对

FILE_A

ANT_HOME=/opt/apps/apache-ant
HIBERNATE=/opt/apps/some/path/to/hibernate
BATCHDAEMON=false
BATCHEDIT_ENABLED=false
BATCHENABLED=false
----
----
<120 lines)

FILE_B

ANT_HOME=$ANT_DIR
HIBERNATE=$HIBERNATE_LOCATION
----
DBCONNECTION=
DBNAME=
DBUSER=
DBPASS=
DBPORT=
DBSERVER=

<70 lines>

我想将File_A中的键与File_B中的键进行比较,以及是否存在从File_B到file_A的匹配替换值

结束结果

FILE_A     ANT_HOME = $ ANT_DIR     HIBERNATE = $ HIBERNATE_LOCATION     的DbConnection =     DBNAME =     DBUSER =     DBPASS =     DBPORT =     DBSERVER =     ....     &lt; 120行&gt;

其中一些值中包含“=” 例如

SOME_PASSWD=Qwcnyt2-49zstyq4=  

所以我一直在使用regexp在“=”

之前获取第一次出现的值

我正在使用awk来查看我是否获得了理想的结果但是,我无法获得正确的替换。

 awk 'BEGIN {FS = "/[^=]*/"} FNR==NR { array[$1]=$2; next } $1 in array { sub ($1, array[$2])} 1' File_B, File_A >> some_tempfile.ini

提前致谢

1 个答案:

答案 0 :(得分:0)

首先解析File_B的想法很好。

如果字段分隔符(FS)设置为 = ,则 $ 1 会直接为当前行提供密钥。这导致使用关联数组。

试试这个测试版本:

awk 'BEGIN { FS="="; } { if (NR==FNR) { pkeynline[$1]=$0; } else if (pkeynline[$1]) { print pkeynline[$1]; } else { print; } }'

测试:

$ cat File_A
ANT_HOME=/opt/apps/apache-ant
HIBERNATE=/opt/apps/some/path/to/hibernate
BATCHDAEMON=false
BATCHEDIT_ENABLED=false
BATCHENABLED=false
SOME_PASSWD=

$ cat File_B
ANT_HOME=$ANT_DIR
HIBERNATE=$HIBERNATE_LOCATION
SOME_PASSWD=Qwcnyt2-49zstyq4=
UNIQ_KEY_FILEB=/home/life/is/great

$ awk 'BEGIN { FS="="; } { if (NR==FNR) { pkeynline[$1]=$0; } else if (pkeynline[$1]) { print pkeynline[$1]; } else { print; } }' File_B File_A > some_tempfile.ini

$ cat some_tempfile.ini
ANT_HOME=$ANT_DIR
HIBERNATE=$HIBERNATE_LOCATION
BATCHDAEMON=false
BATCHEDIT_ENABLED=false
BATCHENABLED=false
SOME_PASSWD=Qwcnyt2-49zstyq4=