我想知道是否可以仅使用 awk 执行以下操作:我正在文件中搜索一些正则表达式,并且我想用另一个字符串(S2)替换与正则表达式匹配的字符串(S1)。当然,使用 awk 很容易做到这一点。但是...我的问题是 S2 的值必须从另一个将 S1 映射到 S2 的文件中获取。
例子 :
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地址之前没有空格):
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[ & ] 似乎无效)?
单程。这是不言自明的。将关联表中的数据保存在数组中,并在第二个文件中检查每个字段是否与数组的任何键匹配:
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 脚本,其周围的单词不带空格。它与前一个类似,但现在它在数组中搜索并尝试在该行的任何位置(默认$0为gsub)找到 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)