검색 패턴 파일을 사용하여 CSV의 마지막 열에서 정확한 단어를 검색하려면 어떻게 해야 합니까?

검색 패턴 파일을 사용하여 CSV의 마지막 열에서 정확한 단어를 검색하려면 어떻게 해야 합니까?

이 문제는 별도의 주제로 논의되지만 모든 내용을 하나로 통합할 수는 없습니다.

TSV 파일이 있습니다. 다음은 샘플 라인입니다: (file1)

NODE_1_length_45927_cov_22.029055_g0_i0 WP_055195622.1  93.1    729     50      0       291     2477    1       729     0.0e+00 1275.4  166486;1897048

마지막 필드에는 로 구분된 숫자 목록이 포함됩니다 ;.

검색 패턴 목록이 포함된 파일(파일 2)이 있습니다.

33090
3041
1897
97100
97101
166486

검색 패턴이 포함된 행을 출력하고 싶습니다.

  1. 마지막 필드만
  2. ;로 구분된 마지막 필드의 모든 숫자는 일치할 수 있지만 패턴과 정확히 일치하는 단어여야 합니다.

지금까지 나의 최선의 시도는

awk 'NR==FNR{a[$1]; next} {for (i in a) if ($NF ~ i) print $0}' file2 file1 

그러나 여기에는 부분 일치가 포함됩니다. 예를 들어 1897은 두 번째 숫자와 일치하므로 일치하지 않습니다.

나는 전체 단어의 다양한 변형을 일치시키기 위해 gawk 정규식을 사용해 보았습니다.

awk 'NR==FNR{a[$1]; next} {for (i in a) if ($NF ~ '/\yi\y/') print $0}' file2 file1
awk 'NR==FNR{a[$1]; next} {for (i in a) if ($NF ~ '/[^[:alpha:]]i[^[:alpha:]]/') print $0}' file2 file1

그러나 출력이 없습니다.

아무리 추악하더라도 모든 bash 솔루션은 훌륭할 것입니다. 그러나 각각 2천만 줄이 있는 12개의 파일이 있기 때문에 루프로 이 문제를 해결할 수 없습니다.빠르게.

어떤 도움이라도 대단히 감사하겠습니다.

답변1

awk 'NR==FNR{a[$1];next}{n=split($NF,b,";");for(i=1;i<=n;i++){if(b[i] in a){print;break}}}' file2 file1

풀린 버전:

awk '
  NR==FNR{a[$1];next}
  {
    n=split($NF,b,";")
    for(i=1;i<=n;i++){
      if(b[i] in a){print;break}
    }
  }   
' file2 file1

split($NF,b,";")마지막 필드를 세미콜론으로 분할하고 결과를 b배열에 넣습니다. b할당된 요소의 수를 반환합니다 n. 귀하의 예제 라인 에서 n=2및 .b[1]=166486b[2]=1897048

if(b[i] in a){print;break}정확히 일치하는 항목이 있으면 해당 줄을 인쇄하고 루프를 중단하여 동일한 줄이 두 번 인쇄되지 않도록 하세요.

답변2

Python 데이터 구조는 set세미콜론으로 구분된 숫자 중 하나가 file2 숫자로 구성된 다른 세트에서 발견되는지 비교하고 찾는 방법을 제공합니다. Yield가 비어 있지 않고 교차점이 설정되면 현재 행을 계속 인쇄합니다.

python3 - file1 file2 <<\eof
import sys

data, pat = sys.argv[1:]
rs, fs = '\n', '\t'

with open(pat) as fp, open(data) as fd:
  pats = set(fp.read().splitlines())
  for l in fd:
    s = l.rstrip(rs).split(fs)[-1].split(';')
    if set(s) & pats: print(l, end='')
eof

답변3

주문하다

 awk 'NR == FNR {a[$1];next}FS=";"($NF in  a){print $0}' f2 f1

산출

NODE_1_length_45927_cov_22.029055_g0_i0 WP_055195622.1  93.1    729     50      0       291     2477    1       729     0.0e+00 1275.4  166486;1897048

관련 정보