2

ファイル'cfg_file'で複数行のテキストを検索し、そのテキストを別のテキストに置き換える必要があります。検索するテキストは「cfg_name」にあり、置換テキストは「cfg_value」にあります。私はubuntum/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

以下のスクリプトを使用しましたが(Webでの以前のクエリから取得)、期待どおりに機能しませんでした。何か案が???

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
4

4 に答える 4

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."
于 2013-01-23T15:25:17.483 に答える
2

変数を読み取るループが 1 つだけの別の awk バージョン:

BEGIN {
  # Read all variables in VAR_TABLE
  while( ( getline VAR < cfg_name ) > 0 ) {
    if ( ( getline VALUE < cfg_value ) > 0 ) {
      VAR_TABLE[ VAR ] = VALUE
    } else {
      print "ERROR: no value for " VAR > "/dev/stderr"
    }
  }
}

{
   # Convert all lines
   for ( VAR in VAR_TABLE ) { gsub( VAR, VAR_TABLE[ VAR ] ) }
   print
}
于 2013-01-23T19:44:28.753 に答える
1

解決策は AWK にある必要がありますか?

これは、開始するための Python コードです...これをファイル「replace.py」に保存してから、実行します。質問で指定したファイル名を挿入しました。

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
于 2013-01-23T15:12:09.130 に答える
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 ) );
于 2013-01-23T15:32:15.267 に答える