Encontre qualquer linha no VI que tenha algo diferente de ATCG

7

Eu tenho um arquivo de dados genômicos que tem aproximadamente 5 milhões de linhas e deve ter apenas os caracteres A, T, C e G nele. O problema é que eu sei o tamanho do arquivo, mas é um pouco maior que isso. O que significa que algo deu errado em uma análise, ou há linhas que contêm algo diferente de dados genômicos.

Existe uma maneira de encontrar qualquer linha que tenha algo diferente de A, T, C ou G? Devido à natureza do arquivo, qualquer outra letra, espaços, números, símbolos não deve estar presente. Eu passei por procurar símbolo por símbolo, então eu esperava que houvesse um jeito mais fácil.

    
por mah 31.08.2018 / 17:42

2 respostas

20

Primeiro de tudo, você definitivamente não quer abrir o arquivo em um editor (é muito grande para editar dessa forma).

Em vez disso, se você quiser apenas identificar se o arquivo contém algo diferente de A , T , C e G , você pode fazer isso com

grep '[^ATCG]' filename

Isso retornaria todas as linhas que continham algo diferente daqueles quatro caracteres.

Se você quiser deletar esses caracteres do arquivo, você pode fazê-lo com

tr -c -d 'ATCG\n' <filename >newfilename

(se esta é a maneira correta de "corrigir" o arquivo ou não, eu não sei)

Isso removeria todos os caracteres no arquivo que não são um dos quatro e também manteria novas linhas ( \n ). O arquivo editado seria gravado em newfilename .

Se for um erro sistemático que adicionou algo ao arquivo, isso poderá ser corrigido por sed ou awk , mas ainda não sabemos como são seus dados.

Se você tiver o arquivo aberto em vi ou vim , o comando

/[^ATCG]

encontrará o próximo caractere no buffer de edição que não é A , T , C ou G .

E :%s/[^ATCG]//g removerá todos eles.

    
por 31.08.2018 / 17:47
0

Eu me concentrei no título

Find any line in VI that has something other than ATCG

E eu testei isso no editor VI, chamado "último modo de linha".

:%!tr -c -d 'ATCG\n

: entra no modo de linha de comando, % corresponde a todo o arquivo como um intervalo, ! filtra esse intervalo por meio de um comando externo tr -c -d 'ATCG\n que é o mesmo que @Kusalananda escreveu:).

    
por 01.09.2018 / 01:21