파일 A.txt:
ATGCATGC
GGGGGGTT
TTTTT
AAAA
파일 B.txt:
asdfasdf
blah2
ATGCATGC
blah3
blah4
delte-me-too
GGGGGGTT
blah5
blah5
....
FileA.txt의 각 줄을 비교하여 FileB.txt에 있는지 확인하고 싶습니다. FileB에 있으면 다음을 삭제하고 싶습니다.
일치하는 선
선 위
다음 두 줄
새 파일로 출력합니다.
참고: 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는 한 번에 한 줄만 기억하면 됩니다.