AWK:替换函数sub()不起作用

时间:2013-01-23 14:46:34

标签: awk

我需要在'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

3 个答案:

答案 0 :(得分:3)

AWK解决方案

有更好的工具可以做到这一点。但是,如果你坚持使用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
}

M4解决方案

正如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 ) );