다음과 같은 파일이 있습니다.
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.6G
2천만 줄이 조금 넘습니다. 시작하지 않는 줄을 얻고 싶습니다.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의 이점이 없으며 속도가 느리고 단순하지 않습니다. 문제에 약간의 변형이 있기 때문에 언급합니다. 예를 들어 열일 수도 있고 아닐 수도 있는 열 뒤에 열을 추가하면 H
grep을 사용하여 해결하기가 더 어려워집니다.
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$"와 일치하지 않는 항목을 표시합니다.