5열에 점이 있으면 행 삭제

5열에 점이 있으면 행 삭제

파일이 있는데 다섯 번째 열에 점이 있으면 모든 행을 삭제하고 싶습니다.

입력 파일:

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

이것버전에서는 구분 기호가 공백이라고 가정하지만 이를 조정할 수 있습니다.

성능:

Namrata는 (댓글) sed스크립트가 스크립트보다 빠르다고 말했습니다 awk.스티븐 차제라스grep동등한 것이 더 빠를 수도 있다고 생각했습니다 ...

관련 정보