maneira de selecionar linhas que mostram variações

2

Eu tenho um arquivo enorme que contém 80 genomas e cinco cromossomos. Eu queria saber se há uma maneira fácil de selecionar apenas as linhas de um cromossomo (por exemplo, 1), mas apenas na posição que mostra as VARIAÇÕES de SNP.

1   180754  GGGGGGGCC   
1   180755  CCCCCCCCC

1   180756  CCTCCCCTC   
1   180757  AAAAAAAAA   
1   180759  TTTTTTTTT   
3   7874113 TTTTTTTTT   
3   7874114 GGGGGGGGG   
3   7874115 GGGGGGGGG   
3   7874116 GGGGGGGGG

Isso é o que eu quero no final:

1   180754  GGGGGGGC        
1   180756  CCTCCCCT    
    
por Mike 28.04.2014 / 16:40

3 respostas

4

Para o seu exemplo:

egrep '1 [[:digit:]]+ (GGGGGGGC|CCTCCCCT)' file

--- editar: então tente isto:

egrep -v '([A-Z]){8}' data
    
por 28.04.2014 / 16:45
2

Com base nos dados de amostra fornecidos, você pode fazer isso usando grep . Dado que os únicos valores válidos para nucleotídeos são A, C, G, T, podemos criar um conjunto de caracteres com apenas aqueles incluídos.

$ grep -Ev '([ACGT]){8}|^$' sample.txt 
1   180754  GGGGGGGCC
1   180756  CCTCCCCTC

Isso funciona ignorando todos os resultados que são mono-tipados. A expressão regular [ACGT]{8} corresponde a todas as strings que são da forma AAAAAAAA, CCCCCCCC, etc. A reversão da correspondência é realizada por meio da opção -v .

   -v, --invert-match
        Invert the sense of matching, to select non-matching lines.  (-v 
        is specified by POSIX.)

O uso de -E torna nosso argumento para grep uma expressão regular que corresponde às linhas acima, [ACGT]{8} ou vazias ( ^$ ).

   -E, --extended-regexp
        Interpret PATTERN as an extended regular expression (ERE, see 
        below).  (-E is specified by POSIX.)

A barra vertical (aka. pipe ( | )) entre os 2 argumentos torna isso um ou aquele tipo de situação correspondente.

Por exemplo, grep -Ev "arg1|arg2" <file> . arg1 seria [ACGT]{8} , enquanto arg2 seria ^$ .

    
por 28.04.2014 / 22:51
1

Não sei exatamente o que você está perguntando (seria útil explicar sua exigência lexicamente em vez de semanticamente ), mas

sed -r sed -r '/^[0-9]+[[:space:]]+[0-9]+[[:space:]]+(.)+\>/d'

excluirá (isto é, não imprimirá) quaisquer linhas nas quais o terceiro campo delimitado por espaço consiste inteiramente de repetições do mesmo caractere inicial, por exemplo,

$ sed -r '/^[0-9]+[[:space:]]+[0-9]+[[:space:]]+(.)+\>/d' genomes.txt
1   180754  GGGGGGGCC   

1   180756  CCTCCCCTC   

Se você sabe que apenas o campo genoma pode conter letras maiúsculas, pode ser seguro fazer uma expressão muito mais simples

sed -r '/\<([A-Z])+\>/d' genomes.txt
    
por 28.04.2014 / 17:17