如果我有一个查找表
cat tmp1
[//rtwttwtr*fgg]\\\erw``~ 1
^774574574565665f[[[//]\] 2
()42543^[[D^[[D^[[D^[[D^[[D353535345****@3242- 3
以及从查找表的第一列中查找的多个字符串,并查看比较的字符串是否完全包含其中一个或另一个字符串(一个字符串是另一个字符串的子字符串),然后返回第二列查找值。
所以如果我的第二个文件是
cat tmp2
[//rtwtt
[//rtwttwtr*fgg]\\\erw``~
[//rtwttwtr*fgg]\\\erw``~4353535^^^7
()42543^[[D^[[D^[[D^[[D^[[D353535345****@3242--
rwerq5555525525
那么我想要的输出是
[//rtwtt 1
[//rtwttwtr*fgg]\\\erw``~ 1
[//rtwttwtr*fgg]\\\erw``~4353535^^^7 1
()42543^[[D^[[D^[[D^[[D^[[D353535345****@3242-- 3
rwerq5555525525
查找条件是查找表字符串或查询字符串是另一个字符串的子字符串,以使匹配为真。
这是我尝试过的,
awk 'NR==FNR{a[$1]=$2;next} { for(as in a) { if(($1~as) || (as~$1)) print $1,a[as]; continue}}' tmp1 tmp2
但我收到无效范围错误
答案1
尝试这个 awk,它不会打印 tmp2 文件中不匹配的字段(rwerq5555525525)。也许一些专家可以帮助解决这个细节。
FNR==NR {
a[$1]=$2;
next;
}
{
s1=split($1,B,"")
lineY="";
for(j=1;j<=s1;j++)
{
if (B[j] ~ /[[:alnum:]]/)
{
lineY=lineY B[j]
}
else
{
lineY=lineY "\\"B[j]
}
}
for (item in a)
{
s=split(item,C,"");
linex="";
for(i=1;i<=s;i++)
{
if (C[i] ~ /[[:alnum:]]/)
{
linex=linex C[i]
}
else
{
linex=linex "\\"C[i]
}
}
if ((match(item,lineY)) || (match($1,linex)))
{
print $1" "a[item];
}
}
}
$ awk -Pf script.awk temp1.txt temp2.txt
[//rtwtt 1
[//rtwttwtr*fgg]\\\erw``~ 1
[//rtwttwtr*fgg]\\\erw``~4353535^^^7 1
()42543^[[D^[[D^[[D^[[D^[[D353535345****@3242-- 3