我有两个文件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
提前致谢
答案 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=