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