文字列を特殊文字と比較

文字列を特殊文字と比較

ルックアップテーブルがある場合

cat  tmp1
[//rtwttwtr*fgg]\\\erw``~ 1
^774574574565665f[[[//]\] 2
()42543^[[D^[[D^[[D^[[D^[[D353535345****@3242- 3

ルックアップテーブルの最初の列で複数の文字列を見つけ、比較された文字列に正確に2つのうちの1つが含まれていることを確認し(1つの文字列は別の文字列の部分文字列です)、2つの列の検索値を返します。

したがって、私の2番目のファイル

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

検索条件が照会テーブル文字列であるか、照会文字列が一致がtrueの別の文字列の部分文字列。

私が試したことは次のとおりです。

awk 'NR==FNR{a[$1]=$2;next} { for(as in a) { if(($1~as) || (as~$1)) print $1,a[as]; continue}}' tmp1 tmp2

ただし、誤った範囲エラーが発生します。

答え1

これを試してみてください。 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

関連情報