Como extrair linha do arquivo em uma condição específica

1

Arquivo:

chromosome  position  ref  alt 
chr1          1398     A    T 
chr1          2980     A    C 
chr2          3323     C    T,A
chr2          3749     T    G
chr3          5251     C    T,G
chr3          9990     G    C,T
chr4          10345    T    G 

Eu preciso extrair a linha completa quando a coluna 4 tiver 2 ou mais caracteres separados por vírgula

A saída esperada é:

chr2          3323     C    T,A
chr3          5251     C    T,G
chr3          9990     G    C,T 
    
por sara 11.09.2013 / 05:27

4 respostas

5

Algumas outras maneiras de ver isso.

Método 1

Como você só está interessado em linhas se elas tiverem mais de dois caracteres separados por vírgulas, você poderá usar apenas grep para vírgulas:

$ grep "," sample.txt 
chr2          3323     C    T,A
chr3          5251     C    T,G
chr3          9990     G    C,T

Método # 2

Você pode usar o recurso PCRE de grep . É aqui que grep pode usar o mecanismo de expressão regular do Perl para fazer a correspondência. É muito poderoso e permite fazer muito do que você pode fazer com o Perl em grep .

vagamente definido

$ grep -P "(\w,)+" sample.txt 

estritamente definido

$ grep -P '\w+\d\s+\d+\s+\w\s+(\w,)+' sample.txt 

Método 3

Usando awk . Isso novamente está aproveitando o fato de que apenas as linhas com uma vírgula ( , ) são de interesse, por isso apenas as encontra e as imprime:

vagamente definido

$ awk '/,/{print}' sample.txt 

mais estritamente definido

$ awk '/([[:alpha:]])+,[[:alpha:]]/{print}' sample.txt 

ainda mais estritamente definido

$ awk '$4 ~ /([[:alpha:]])+,[[:alpha:]]/{print}' sample.txt

Este analisa o conteúdo da quarta coluna e verifica se é uma letra seguida por uma vírgula, seguida por outra letra.

ainda mais estritamente definido

$ awk '$4 ~ /([GATC])+,[GATC]/{print}' sample.txt 

Isto procura apenas um G, A, T ou C seguido por uma vírgula, seguido por outro G, A, T ou C.

    
por 11.09.2013 / 06:10
2
perl -ane 'print if($F[3] =~ /^\w,\w/$);' file

-n diz ao perl para processar o arquivo uma linha de cada vez passando cada linha para os comandos especificados em -e . O -a diz ao perl para expandir cada linha ao redor do separador de campos (o padrão é espaço) e atribui isso a uma matriz chamada @F . O resultado é para cada linha que podemos processá-lo e usar $F[n] para se referir ao enésimo elemento dessa linha.

Em seguida, testamos se o campo 4 $F[3] contém o início da string ^ , um caractere de palavra \w seguido por uma vírgula e depois outro caractere de palavra \w e o final da string $ . Se isso for bem sucedido, nós print da linha.

Se esses "caracteres de palavras" forem sempre citosina, adenina, guanina e timina, você poderá torná-lo mais explícito com:

perl -ane 'print if($F[3] =~ /^[GATC],[GATC]$/);' file
    
por 11.09.2013 / 05:29
2

Outra solução para o awk.

awk 'length($4) > 2 && $4 ~ /^([^,],)+[^,]$/' file_name

Testado com o nawk, também funcionará com o gawk. Isto irá corresponder a A, T, G, C, Z, Q, R

Novamente, se você está apenas combinando com o ATGC:

awk 'length($4) > 2 && $4 ~ /([ATGC],)+[ATGC]/' file_name
    
por 11.09.2013 / 06:31
1

Um simples awk one-liner:

awk '$4 ~ ","' file
    
por 11.09.2013 / 06:10

Tags