대용량 파일에서 "H"로 끝나지 않는 줄을 다른 파일로 추출

대용량 파일에서 "H"로 끝나지 않는 줄을 다른 파일로 추출

다음과 같은 파일이 있습니다.

TITLE     Protein in water t=   0.00000
REMARK    THIS IS A SIMULATION BOX
ATOM      1  N   SER A 107      20.799  63.728  25.985  1.00  0.00           N
ATOM      2  H1  SER A 107      21.658  64.259  25.980  1.00  0.00           H

이것은 매우 큰 파일입니다: 1.6G2천만 줄이 조금 넘습니다. 시작하지 않는 줄을 얻고 싶습니다.ATOM 그리고종료 H하고 다른 파일에 저장합니다. 이를 수행하는 가장 효율적인 방법은 무엇입니까?

답변1

댓글의 설명에 따르면,

sed -n '/^ATOM.*H$/!p' input > output

"ATOM"으로 시작하고 "H"로 끝나는 줄은 이름이 지정된 파일에서 제거(인쇄되지 않음)되고 input나머지 줄은 이름이 지정된 파일에 인쇄됩니다 output. sed 구문은 왼쪽에서 오른쪽으로:

  • -n-- 기본적으로 줄을 인쇄하지 않음
  • /^ATOM.*H$/-- ATOM으로 시작하고 그 뒤에 임의 개수의 문자가 오고 $H( )로 끝나는 줄을 찾습니다.
  • !p-- 인쇄 라인아니요위 패턴을 맞춰보세요

입력 파일 예:

TITLE     Protein in water t=   0.00000
REMARK    THIS IS A SIMULATION BOX
ATOM      1  N   SER A 107      20.799  63.728  25.985  1.00  0.00           N
ATOM      2  H1  SER A 107      21.658  64.259  25.980  1.00  0.00           H
TITLE     Protein in water t=   0.00000H
REMARK    THIS IS A SIMULATION BOXH
ATOM      1  N   SER A 107      20.799  63.728  25.985  1.00  0.00           N
ATOM      2  H1  SER A 107      21.658  64.259  25.980  1.00  0.00           H

결과 :

TITLE     Protein in water t=   0.00000
REMARK    THIS IS A SIMULATION BOX
ATOM      1  N   SER A 107      20.799  63.728  25.985  1.00  0.00           N
TITLE     Protein in water t=   0.00000H
REMARK    THIS IS A SIMULATION BOXH
ATOM      1  N   SER A 107      20.799  63.728  25.985  1.00  0.00           N

보다 직접적인 sed 구문은 다음과 같습니다.

sed '/^ATOM.*H$/d' input > output

이는 다음과 같이 말합니다.

  • (기본 인쇄 라인)
  • ATOM으로 시작하고 H로 끝나는 줄 검색
  • 이 줄을 삭제(인쇄하지 않음)

답변2

내용을 기반으로 행을 선택하는 도구는grep, 콘텐츠 선택 규칙을 다음과 같이 표현할 수 있는 한정규식.

"다음으로 시작"에 대한 정규식은 ATOM입니다 ^ATOM. ""로 끝나는 정규식은 H입니다 H$. 둘은 겹칠 수 없기 때문에 "로 시작 ATOM하고 무엇이든 포함하고 "로 끝나는 H정규식 은 입니다 ^ATOM.*H$.

정규식과 일치하지 않는 행을 선택하려면 옵션을 사용하십시오 -v.

grep -v '^ATOM.*H$' large_file.txt >not_atom_h.txt

보다 일반적인 조건, 특히 열 기반 형식의 경우 다음을 사용할 수 있습니다.. 다음은 샘플 데이터와 동일한 awk 프로그램입니다. ATOM첫 번째 열이 없거나 마지막 열이 아닌 행을 인쇄합니다 H. 이 특별한 경우에는 awk의 이점이 없으며 속도가 느리고 단순하지 않습니다. 문제에 약간의 변형이 있기 때문에 언급합니다. 예를 들어 열일 수도 있고 아닐 수도 있는 열 뒤에 열을 추가하면 Hgrep을 사용하여 해결하기가 더 어려워집니다.

awk '$1 != "ATOM" || $NF != "H"' large_file.txt >not_atom_h.txt

답변3

명령줄 길이 측면에서 제가 생각할 수 있는 가장 짧은 길이는 다음과 같습니다.

grep -vx ATOM.\*H

처리 속도 측면에서 적어도 내 시스템에서 내가 찾은 가장 빠른 속도는 다음과 같습니다.

mawk '!/^ATOM.*H$/'

답변4

(아래 의견에 따르면 이것이 최선의 해결책은 아닙니다)

다음과 같이 할 수도 있습니다.

grep '[H$]' 소스 파일 > 대상 파일

대괄호 안에 "H$"("H로 끝나는")를 넣어 이를 무효화합니다. 따라서 grep은 "H$"와 일치하지 않는 항목을 표시합니다.

관련 정보