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.
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.
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.
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 sed 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 ...