문자열을 특수 문자와 비교

문자열을 특수 문자와 비교

조회 테이블이 있는 경우

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

검색 조건이 조회 테이블 문자열이거나 쿼리 문자열이 일치가 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

관련 정보