我需要在'cfg_file'文件中搜索多行文本,并用另一个文本替换该文本。 要搜索的文本位于“cfg_name”中,替换文本位于“cfg_value”中。 我正在使用ubuntu m / c。
cfg_file:
rem01=("LOG_CHAN01_REM_IP" transport("tcp") port( LOG_CHAN01_REM_PORT ) );
rem02=("LOG_CHAN02_REM_IP" transport("tcp") port( LOG_CHAN02_REM_PORT ) );
cfg_name:
LOG_CHAN01_REM_IP
LOG_CHAN01_REM_PORT
LOG_CHAN02_REM_IP
LOG_CHAN02_REM_PORT
cfg_value:
10.123.122.52
50001
10.15.19.51
50002
我使用了以下脚本(从网络上的一些早期查询中获取),但没有按预期工作。任何想法???
awk 'BEGIN { RS="" }
FILENAME==ARGV[1] { s=$0 }
FILENAME==ARGV[2] { r=$0 }
FILENAME==ARGV[3] { sub(s,r); print }
END { print NR, "Students Records are processed." }
' ./cfg_name ./cfg_value ./cfg_file > ./outfile
答案 0 :(得分:3)
有更好的工具可以做到这一点。但是,如果你坚持使用awk:
FILENAME == ARGV[1] {
name[FNR] = $0
}
FILENAME == ARGV[2] {
value[name[FNR]] = $0
}
FILENAME == ARGV[3] && FNR <= 20000 {
for (n in value) {
gsub(n, value[n]);
}
print
}
正如Catcall建议的那样,我们可以使用m4:
#!/bin/bash
# Script's arguments: cfg_name cfg_value cfg_file
{
paste $1 $2 | while read name value
do
echo "define(\`${name}', \`${value}')"
done
cat $3
} | m4
echo "$(wc -l $3) Students Records are processed."
答案 1 :(得分:1)
解决方案是否必须使用AWK?
以下是一些可以帮助您入门的Python代码...将其保存到文件&#34; replace.py&#34;然后运行它。我插入了你在问题中指定的文件名。
substitution_dict = {}
name_file = open("cfg_name","r")
value_file = open("cfg_value","r")
for line in name_file.readlines():
name = line.strip()
value = value_file.readline().strip()
substitution_dict[name]=value
for line in open("cfg_file","r").readlines():
line = line.strip()
for name in substitution_dict.keys():
line = line.replace(name, substitution_dict[name])
print line
答案 2 :(得分:1)
正确的方法是首先读取2个文件(名称和值),然后将替换应用于cfg_file。
AWK代码是:
#!/usr/bin/awk -f
BEGIN {
file = ARGV[1];
name = ARGV[2];
value = ARGV[3];
ARGC = 2;
i = 1;
while ( (getline < name) > 0 ) {
names[i] = $1;
i++;
}
i = 1;
while ( (getline < value) > 0 ) {
values[i] = $1;
i++;
}
}
{
for ( i in names ) {
sub( names[i], values[i], $0 );
}
print $0;
}
END {
print NR" Students Records are processed.";
}
我将代码保存到merge.awk
,您可以这样调用:
awk -f merge.awk ./cfg_file ./cfg_name ./cfg_value
输出是:
rem01=("10.123.122.52" transport("tcp") port( 50001 ) );
rem02=("10.15.19.51" transport("tcp") port( 50002 ) );