파일을 반복하고 awk 문에서 각 줄을 새로운 정규식으로 만들려면 어떻게 해야 합니까?

파일을 반복하고 awk 문에서 각 줄을 새로운 정규식으로 만들려면 어떻게 해야 합니까?

파일 A.txt:

ATGCATGC 
GGGGGGTT
TTTTT
AAAA

파일 B.txt:

asdfasdf
blah2
ATGCATGC
blah3
blah4 
delte-me-too
GGGGGGTT
blah5
blah5
....

FileA.txt의 각 줄을 비교하여 FileB.txt에 있는지 확인하고 싶습니다. FileB에 있으면 다음을 삭제하고 싶습니다.

  1. 일치하는 선

  2. 선 위

  3. 다음 두 줄

새 파일로 출력합니다.

참고: FileA에는 500,000개의 행이 있습니다. 스키마를 하드코딩하지 않는 방식으로 이 작업을 수행하고 싶습니다.

현재 이 줄을 제거하는 것이 있지만 FileA를 반복하여 이 awk 표현식에 대한 새 패턴을 만드는 것이 혼란스럽습니다.

awk '/$VARIABLE_REGEX/{for(x=NR-2;x<=NR+2;x++)d[x];} {a[NR]=$0}
END{for(i=1;i<=NR;i++)
    if(!(i in d))
        print a[i]}' FileB.txt

답변1

참고: 오류 검사는 없습니다. 또한 두 번째 파일의 입력이 언급된 패턴을 정확히 따른다고 가정합니다.

awk 'NR== FNR {a[$0] = $0 ; next } {if (!($0 in a)) {b[count++] = $0; } else {count--; if (count > 0) delete b[count];getline;getline; }} END {for (i=0; i<count; i++) print b[i] }' 1 2

1과 2를 입력하세요.

1

ATGCATGC
GGGGGGTT
TTTTT
AAAA

2

asdfasdf
blah2
ATGCATGC
blah3
blah4 
delte-me-too
GGGGGGTT
blah5
blah5
foo
foo-delete
AAAA
bar-delete
bar-delete
bar-ok

산출

asdfasdf
foo
bar-ok

답변2

다음 코드는 최적이 아닙니다.파일B.txt두 번) 하지만 더 빠르기를 바랍니다.

comm --nocheck-order -23 FileB.txt <(grep -B1 -A2 -Ff FileA.txt FileB.txt)

새로운GNU sed시도해 볼 수 있는 명령 e(메모리 절약을 위해)sed+grep:

sed 'N;h;s/.*\n//;s/.*/grep -xF "&" FileA.txt/e;/./{N;N;d};x;P;D' FileB.txt

답변3

이것은 귀하의 샘플에 적용됩니다

awk '
    NR==FNR {patt[$0]; next} 
    $0 in patt {getline; getline; getline; prev=$0; next} 
    {print prev; prev=$0} 
    END {print prev}
' fileA.txt fileB.txt 

파일 A의 전체 내용을 메모리에 유지해야 하지만 파일 B는 한 번에 한 줄만 기억하면 됩니다.

관련 정보