使用awk用另一个字符串替换字符串(包含在文件中的映射表)

时间:2012-07-07 18:11:09

标签: awk

我想知道是否可以仅使用以下内容 AWK: 我在文件中搜索一些正则表达式Fand我想替换匹配的字符串(S1) 另一个字符串的正则表达式(S2)。当然,用awk很容易做到这一点。但是......我的 问题是必须从另一个映射文件中获取S2的值 S1到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 [&amp;]似乎 无效)?

1 个答案:

答案 0 :(得分: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($0的默认gsub)并替换它。

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

假设infile包含文件F的第二个示例的内容,输出将为:

abcdfoo qsqsjsdfjsjdf                                                                                                                                                                                                                        
sdfsdffsd                                                                                                                                                                                                                                    
bar sqqsfjqsfsdf