1

awk のみを使用して次のことを実行できるかどうかを知りたい: ファイル F で正規表現を検索しており、その正規表現に一致する文字列 (S1) を別の文字列 (S2) に置き換えたい。もちろん、awk を使えば簡単にできます。しかし...私の問題は、S1をS2にマップする別のファイルからS2の値を取得する必要があることです。

例 :

ファイル F:

abcd 168.0.0.1 qsqsjsdfjsjdf
sdfsdffsd
168.0.0.2 sqqsfjqsfsdf

別のファイルの連想テーブル

168.0.0.1 foo
168.0.0.2 bar

私は手に入れたい:

この結果:

abcd foo qsqsjsdfjsjdf
sdfsdffsd
bar sqqsfjqsfsdf

手伝ってくれてありがとう !

編集: 入力ファイルが次のように少し異なる場合 (IP アドレスの前にスペースはありません):

ファイル F:

abcd168.0.0.1 qsqsjsdfjsjdf
sdfsdffsd
168.0.0.2 sqqsfjqsfsdf

$1、$2 変数を使用して連想配列を検索することはできません。私はそのようなことを試みました(美麗の命題に基づいて)が、うまくいきませんでした:

FNR < NR {
    sub(/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/, assoc [ & ] );
    print
}

連想配列で一致した文字列を検索する方法はありますか (assoc[ & ] は無効のようです)。

4

1 に答える 1

4

一方通行。それは自明です。連想テーブルのデータを配列に保存し、2 番目のファイルで、各フィールドが配列のいずれかのキーと一致するかどうかを確認します。

awk '
    FNR == NR {
        assoc[ $1 ] = $2;
        next;
    }
    FNR < NR {
        for ( i = 1; i <= NF; i++ ) {
            if ( $i in assoc ) {
                $i = assoc[ $i ]
            }
        }
        print
    }
' associative_file F

出力:

bcd foo qsqsjsdfjsjdf                                                                                                                                                                                                                        
sdfsdffsd                                                                                                                                                                                                                                    
bar sqqsfjqsfsdf

編集awk:周囲の単語でスペースを含まない IP の次のスクリプトを試してください。$0これは前のものと似ていますが、配列内を検索し、行の任意の場所 ( のデフォルト)でIP を見つけようとし、gsubそれを置き換えます。

awk '
    FNR == NR {
        assoc[ $1 ] = $2;
        next;
    }
    FNR < NR {
        for ( key in assoc ) {
            gsub( key, assoc[ key ] )
        }
        print
    }
' associative_file F

infilefile の 2 番目の例のコンテンツを想定するとF、出力は次のようになります。

abcdfoo qsqsjsdfjsjdf                                                                                                                                                                                                                        
sdfsdffsd                                                                                                                                                                                                                                    
bar sqqsfjqsfsdf
于 2012-07-07T18:48:09.890 に答える