Excluindo linhas se houver um ponto na quinta coluna

5

Eu tenho um arquivo e quero remover toda a linha se tiver um ponto na quinta coluna.

Arquivo de entrada:

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

Resultado esperado:

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

Nota: O arquivo tem um tamanho de 64G e tem 690.000.000 linhas nele. Existe uma solução eficiente, pois é um grande conjunto de dados. Eu preferiria Awk e Sed como sou novo no campo. Obrigado pela sua ajuda.

    
por Namrata 11.10.2013 / 17:10

3 respostas

8

Você pode tentar isso

awk '{ if ( $5 != "." ) { print $0; } }' input_file.Txt > output_file.txt

Isso testará se a quinta coluna não é um ponto e exibe a linha.

    
por 11.10.2013 / 17:18
5

Com grep , supondo que as colunas estejam separadas por tabulação, aqui usando o ksh93 / zsh / bash $'...' quotes:

LC_ALL=C grep -v $'^\([^\t]*\t\)\{4\}\.\t'

Se as colunas estiverem separadas por qualquer quantidade de espaços em branco:

LC_ALL=C grep -vE '^([^[:blank:]]+[[:blank:]]+){4}\.[[:blank:]]'

O GNU grep é geralmente mais rápido que awk (especialmente o GNU awk ) ou sed . Definir a localidade como C geralmente acelera as coisas também.

    
por 11.10.2013 / 18:36
4
awk '$5 != "."' your-big-file     # from manatwork's comment

ou

sed -n '/^ *[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+[^ ]\+ \+\. /!p' your-big-file

A versão portátil do comentário de Stephane Chazelas:

sed -n '/^ *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *[^ ][^ ]*  *\. /!p' your-big-file

A versão supõe que o separador seja um espaço, mas você pode adaptá-lo.

Desempenho:

Namrata disse (comentário) que o script sed é mais rápido que o awk one. Stephane Chazelas acha que o grep equivalente pode ser ainda mais rápido ...

    
por 11.10.2013 / 17:18

Tags