Identificando genes de uma lista de genes

6

Eu tenho um arquivo de lista de genes. Alguma coisa assim

    SWT21
    SSA1
    NRP1
    EFB1
    TFC3
    MDM10

Eu tenho outro arquivo que também contém os nomes desses genes na minha lista, juntamente com outras informações essenciais sobre eles. O segundo arquivo é assim:

chrI    147593  151166  YAL001C -   TFC3
chrI    143706  147531  YAL002W +   VPS8
chrI    142173  143160  YAL003W +   EFB1
chrI    140759  141407  YAL004W +   YAL004W
chrI    139502  141431  YAL005C -   SSA1
chrI    137697  138345  YAL007C -   ERP2
chrI    136913  137510  YAL008W +   FUN14
chrI    135853  136633  YAL009W +   SPO7
chrI    134183  135665  YAL010C -   MDM10

Eu quero extrair essas linhas no segundo arquivo que tem nomes de genes como estão no primeiro arquivo.

    
por user3138373 24.03.2014 / 21:26

4 respostas

8

Tudo o que você precisa é de um simples grep :

grep -Fwf gene_list.txt gene_info.txt

As opções usadas são:

  • -w: Procura por palavras inteiras, isso garante que o nome do gene ERK1 não corresponda ao gene ERK12 ( -w não é uma opção padrão, mas é bastante comum)
  • -f: Leia os padrões a serem pesquisados em um arquivo. Neste caso, gene_list.txt .
  • -F: trata os padrões como strings, não como expressões regulares. Isso garante que um nome de gene como TOR* (se tal coisa existisse) não corresponderia a TORRRRRR .

NOTA: Isso pressupõe que não há espaços ao redor dos nomes dos genes na sua lista. Se houver, você precisará removê-los primeiro (aqui com GNU sed ):

sed -i 's/ //g' gene_list.txt
    
por 24.03.2014 / 21:36
7

De um exemplo no wiki do awk :

awk 'FNR==NR {arr[$0];next} $6 in arr' gene_list info_list

Explicação copiada da entrada do wiki:

  • FNR == NR : este teste é verdadeiro quando o número de registros é igual ao número de registros no arquivo. Isso só é válido para o primeiro arquivo, pois o segundo arquivo NR será igual ao número de linhas do arquivo1 + FNR.
  • arr[$0] : esta é uma técnica clássica para criar um índice de elemento de matriz por toda a linha. Isso criará uma matriz com os primeiros nomes do arquivo1.
  • next : isso irá pular para o próximo registro, para que nenhum processamento seja feito no arquivo1.
  • $6 in arr : Isso só acontecerá nos registros do arquivo2 por causa do próximo. Se $ 1 estiver presente em arr, ou seja, no arquivo1, a ação padrão será executada e a linha será impressa.
por 24.03.2014 / 21:47
4

Para maior robustez você pode alterar a lista de genes em expressões regulares para combinar no final da linha. Isso deve funcionar (e ser compatível com POSIX):

sed 's/[[:space:]]*$/[[:space:]]*$/' gene_list | grep -wf - gene_info

Ou com espaços iniciais no gene_list (conforme o exemplo na pergunta):

sed 's/$/[[:space:]]*$/; s/[[:space:]]//' gene_list |
  grep -wf - gene_info

Claro que isso não funcionará se houver caracteres incluídos nos nomes dos genes que são interpretados por expressões regulares. Entretanto, se esse for o caso, você precisará adicionar expressões de substituição extras a sed para evitá-las, por exemplo, s:\[:\[: .

    
por 24.03.2014 / 21:42
0

Assumindo que a lista de genes é list.txt e o arquivo info é info.txt , assim como os nomes dos genes nunca contêm espaço em branco:

for item in $(cat list.txt); do grep "\s$item$" info.txt ; done

Saída:

chrI    139502  141431  YAL005C -   SSA1
chrI    142173  143160  YAL003W +   EFB1
chrI    147593  151166  YAL001C -   TFC3
chrI    134183  135665  YAL010C -   MDM10
    
por 25.03.2014 / 00:44