我有2个文件,想根据这2个文件(testfile 1和2)创建一个新文件。通过从testfile1.txt中逐行阅读第一个文件,并根据testfile2.txt中特殊字符@和其值之间的字符串匹配。更多细节见下文。testfile1.txt
## START :: start of file ##
[email protected]_path@
#
pa[email protected]_brkr_path@
#
[email protected]_path@
#
path.mw.site[email protected]_brkr_path@
## END :: end of file ##
testfile2.txt
mysite.mw_path=/mw/mysite/cfg/DATA1/
mysite.mw_brkr_path=/usr/local/mw/mysite/cfg/DATA2/=/mydirectory/
这是我的命令
awk 'FNR==NR{a[$1]=$2; next} match($0, "@[^@]*@"){
i=substr($0, RSTART+1, RLENGTH-2 "@");
gsub("@"i"@", a[i]); }1 ' FS== testfile2.txt testfile1.txt
## START :: start of file ##
path.mw.site.profiles=/mw/mysite/cfg/DATA1/
#
path.mw.site.broker.profiles=/usr/local/mw/mysite/cfg/DATA2/
#
path.mw.site.profiles=/mw/mysite/cfg/DATA1/
#
path.mw.site.broker.profiles=/usr/local/mw/mysite/cfg/DATA2/
## END :: end of file ##
我得到了上面的输出。我期待输出如下。
## START :: start of file ##
path.mw.site.profiles=/mw/mysite/cfg/DATA1/
#
path.mw.site.broker.profiles=/usr/local/mw/mysite/cfg/DATA2/=/mydirectory/
#
path.mw.site.profiles=/mw/mysite/cfg/DATA1/
#
path.mw.site.broker.profiles=/usr/local/mw/mysite/cfg/DATA2/=/mydirectory/
## END :: end of file ##
先谢了。
6条答案
按热度按时间0qx6xfy61#
iswrvxsc2#
不要在 every
=
字符处拆分输入,而是以不同的方式提取键和值。可能的解决办法(除其他外)
mkshixfv3#
文件分隔符FS设置为
=
,testfile2.txt 有2个等号,这就是为什么您在输出中缺少第三部分,因为您只使用$2
你可以做的是删除FS==,因为你不需要 testfile1.txt,并在一个更具体的字符串
_path=
上分割 testfile2.txt输出
tvokkenx4#
假设条件:
@some_pattern_to_match@
不匹配,则保持原样向
testfile1.txt
添加一个不匹配的条目(请参阅最后一行旁边的内容):awk
:这产生:
b4qexyjb5#
为什么不使用
sed
:输出量:
qvsjd97n6#