파일이 있는데 다섯 번째 열에 점이 있으면 모든 행을 삭제하고 싶습니다.
입력 파일:
sc2/80 20 . A C 80 PASS N=2 F=5;U=4
sc2/60 55 . G . 72 PASS N=2 F=5;U=4
sc2/68 20 . T A 71 PASS N=2 F=5;U=4
sc2/10 24 . T . 31 PASS N=2 F=5;U=4
sc2/40 59 . T . 31 PASS N=2 F=5;U=4
sc2/24 24 . A G 38 PASS N=2 F=5;U=4
예상 출력:
sc2/80 20 . A C 80 PASS N=2 F=5;U=4
sc2/68 20 . T A 71 PASS N=2 F=5;U=4
sc2/24 24 . A G 38 PASS N=2 F=5;U=4
참고: 파일 크기는 64G이며 690,000,000줄을 포함합니다. 상당히 큰 데이터 세트이므로 효율적인 솔루션이 있습니까? 나는 이 분야가 처음이기 때문에 Awk와 Sed를 선호합니다. 당신의 도움을 주셔서 감사합니다.
답변1
당신은 이것을 시도 할 수 있습니다
awk '{ if ( $5 != "." ) { print $0; } }' input_file.Txt > output_file.txt
다섯 번째 열이 점이 아닌지 테스트하고 선을 표시합니다.
답변2
의 경우 grep
열이 탭으로 구분되어 있다고 가정하면 ksh93/zsh/bash $'...'
따옴표가 여기에 사용됩니다.
LC_ALL=C grep -v $'^\([^\t]*\t\)\{4\}\.\t'
열이 공백으로 구분된 경우:
LC_ALL=C grep -vE '^([^[:blank:]]+[[:blank:]]+){4}\.[[:blank:]]'
GNU는 grep
일반적 으로 awk
(특히 GNU awk
) sed
. 로케일을 C로 설정하면 일반적으로 작업 속도도 빨라집니다.
답변3
awk '$5 != "."' your-big-file # from manatwork's comment
또는
sed -n '/^ *[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+\. /!p' your-big-file
Stephane Chazelas가 검토한 휴대용 버전:
sed -n '/^ *[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]* *[^ ][^ ]* *\. /!p' your-big-file
이것sed버전에서는 구분 기호가 공백이라고 가정하지만 이를 조정할 수 있습니다.
성능:
Namrata는 (댓글) sed
스크립트가 스크립트보다 빠르다고 말했습니다 awk
.스티븐 차제라스grep
동등한 것이 더 빠를 수도 있다고 생각했습니다 ...