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

jea*_*ean 2 awk

我想知道是否可以仅使用 awk 执行以下操作:我正在文件中搜索一些正则表达式,并且我想用另一个字符串(S2)替换与正则表达式匹配的字符串(S1)。当然,使用 awk 很容易做到这一点。但是...我的问题是 S2 的值必须从另一个将 S1 映射到 S2 的文件中获取。

例子 :

文件F:

abcd 168.0.0.1 qsqsjsdfjsjdf
sdfsdffsd
168.0.0.2 sqqsfjqsfsdf
Run Code Online (Sandbox Code Playgroud)

我的关联表在另一个文件中

168.0.0.1 foo
168.0.0.2 bar
Run Code Online (Sandbox Code Playgroud)

我想得到:

这个结果:

abcd foo qsqsjsdfjsjdf
sdfsdffsd
bar sqqsfjqsfsdf
Run Code Online (Sandbox Code Playgroud)

感谢帮助 !

编辑:如果我的输入文件有点不同,就像这样(IP地址之前没有空格):

文件F:

abcd168.0.0.1 qsqsjsdfjsjdf
sdfsdffsd
168.0.0.2 sqqsfjqsfsdf
Run Code Online (Sandbox Code Playgroud)

我无法使用 $1、$2 变量并在关联数组中搜索。我尝试了类似的方法(基于 birei 命题),但它不起作用:

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

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

Bir*_*rei 5

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

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
Run Code Online (Sandbox Code Playgroud)

输出:

bcd foo qsqsjsdfjsjdf                                                                                                                                                                                                                        
sdfsdffsd                                                                                                                                                                                                                                    
bar sqqsfjqsfsdf
Run Code Online (Sandbox Code Playgroud)

编辑:尝试以下awkIP 脚本,其周围的单词不带空格。它与前一个类似,但现在它在数组中搜索并尝试在该行的任何位置(默认$0gsub)找到 IP 并替换它。

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

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

abcdfoo qsqsjsdfjsjdf                                                                                                                                                                                                                        
sdfsdffsd                                                                                                                                                                                                                                    
bar sqqsfjqsfsdf
Run Code Online (Sandbox Code Playgroud)

  • 您应该执行“if (i in assoc)”而不是“if (assoc[$i])”,因为后者只需引用它即可在数组中创建一个条目。您可以省略“FNR &lt; NR”选择器,因为它始终为 true(因为“next”)。您可以省略“$0 = $0”,因为“$i =”赋值会执行任何必要的字段重新计算。 (2认同)