1

我想知道是否可以仅使用 awk 执行以下操作:我正在文件中搜索一些正则表达式 Fand 我想用另一个字符串 (S2) 替换与正则表达式匹配的字符串 (S1)。当然,使用 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 变量和搜索。我尝试了类似的方法(基于 birei 命题),但没有奏效:

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

有没有办法在关联数组中搜索匹配的字符串(assoc[ & ] 似乎无效)?

4

1 回答 1

4

单程。这是不言自明的。将关联表中的数据保存在数组中,并在第二个文件中检查每个字段是否与数组的任何键匹配:

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 及其周围的单词。它与前一个类似,但现在它在数组中搜索并尝试在该行的任何位置找到一个 IP(默认$0gsub)并替换它。

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

假设infile使用第二个 file 示例的内容F,输出将是:

abcdfoo qsqsjsdfjsjdf                                                                                                                                                                                                                        
sdfsdffsd                                                                                                                                                                                                                                    
bar sqqsfjqsfsdf
于 2012-07-07T18:48:09.890 回答