2016-04-06 7 views
1

у меня есть два файла 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 в файл_A

Конечный результат

File_A ANT_HOME = $ ANT_DIR Hibernate = $ HIBERNATE_LOCATION DBConnection = DBNAME = DBUSER = DBPass = DbPort = DBSERVER = .... < 120 Lines>

также некоторые из них имеют «=» в них
например

SOME_PASSWD=Qwcnyt2-49zstyq4= 

поэтому я использую регулярное выражение, чтобы получить первое вхождение значения перед «=»

Я использую 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

Идея разобрать 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= 
+0

, которая работала прекрасно, спасибо большое – TechArch

Смежные вопросы