다른 파일의 이름이나 접미사와 같지 않은 한 파일의 모든 줄을 쿼리하는 방법

다른 파일의 이름이나 접미사와 같지 않은 한 파일의 모든 줄을 쿼리하는 방법

file1두 개의 파일 이 있고 file2이 두 파일에는 . 한 줄에 하나의 이름입니다. 에 있는 모든 이름 file2또는 not equal to에 있는 suffix of이름을 쿼리하고 싶습니다 file1. 접두사는 .임의의 문자와 점( ) 및 접미사로 식별됩니다.

예를 들어. file2포함이 f2name행에 있고 file1포함이 sub.f2namef2name있는 이름의 접미사 인 경우 file1결과에 포함하고 싶지 않습니다.

또 다른 예는 입니다 sub1.sub2.f2name. in names앞에는 file1여러 개의 접두사(점으로 구분된 문자)가 올 수 있습니다. 이름은 file2원하는 수의 접두사에 대한 접미사로 표시되거나 의 이름과 동일할 수 있습니다 file1.

쿼리의 이름이 file2같지 않고 이름 접두사의 접미사가 아닌 이름이 필요합니다 file1. 예: 다음을 file2포함합니다:

bb.com
a.com
123.com

file1포함하다:

aa.bb.com
aa.ff.bb.com
aa.bb.cc.com
a.com

내가 원하는 이름은 file2같지도 않고 이름 접미사도 아닌 이름입니다 file1. 즉:

123.com

출력 이유: a.comin은 in 의 file2이름과 동일하며 from 은 and in의 접미사입니다 (참고: 접두사는 한두 번 이상 반복될 수 있습니다. 중요한 것은 이름이 in으로 끝난다는 것입니다).file1aa.bb.combb.comfile2aa.ff.bb.comaa.bb.comfile1file2

MySQL을 사용하여 쿼리를 시도했습니다. 그러나 file2에는 300만 줄이 포함되고 file1에는 100만 줄이 포함됩니다. MySQL이 제대로 작동하지 않습니다. 합리적인 시간 내에 이러한 쿼리를 수행할 수 있는 명령이 Linux에 있습니까?

답변1

귀하의 의견에 따르면 이것이 얼마나 효율적인지는 모르겠지만 가능한 전략은 다음과 같습니다.

  1. file2라인을 라인 앵커 정규식 패턴으로 변환

    sed -e 's/\./\\./g' -e 's/$/\$/' file2
    
  2. 패턴을 grep으로 파이프하여 일치하는 부분만 출력합니다.file1

    ... | grep -of - file1
    
  3. (선택사항) 고유한 결과

  4. file2일치하는 항목 에 대한 일반 텍스트 검색

    ... | grep -vxFf - file2
    

전임자.

$ sed -e 's/\./\\./g' -e 's/$/\$/' file2 | 
    grep -of - file1 | 
    sort -u | 
    grep -vxFf - file2
123.com

file2항목에 이들 이외의 정규식 특수 문자가 포함되어 있는 경우에도 .이스케이프해야 합니다.

관련 정보