Como eu comparo um arquivo de texto com cerca de duas dúzias de outros arquivos de texto e imprimo certas colunas de cada linha sempre que houver uma correspondência?

2

Eu tenho 'FileA':

10      10011300        10011301        T       C
10      10012494        10012495        G       A
10      10028691        10028692        A       T
10      10093496        10093497        G       A
10      10102457        10102458        C       T
10      10103252        10103253        G       C
10      10122271        10122272        T       C
10      10128778        10128779        T       C
10      10130299        10130300        C       A
10      10148307        10148308        G       A

e eu tenho arquivos 1-22:

1       10177   rs367896724
1       10235   rs540431307
1       10352   rs555500075
1       10505   rs548419688
1       10506   rs568405545
1       10511   rs534229142
1       10539   rs537182016
1       10542   rs572818783
1       10579   rs538322974
1       10616   rs376342519

Como você pode dizer, estou lidando com dados genéticos. O que eu quero fazer é sempre que as colunas 1 e 3 do FileA correspondam às colunas 1 e 2 dos arquivos 1-22, colunas 1, 2 e 3 dos arquivos 1-22 (ou colunas 1 e 3 do FileA e coluna 3 dos arquivos 1 -22) são impressos em um arquivo de texto com o número compartilhado entre o FileA e os arquivos 1-22 na coluna 1 como o nome do arquivo de texto.

Até agora, estou empenhado em classificar os arquivos para poder invocar join . O FileA continua me dando um erro, embora eu esteja tentando classificá-lo exatamente da mesma maneira que consegui classificar os arquivos de 1 a 22.

Essencialmente, o que eu espero é um tutorial para fazer exatamente o que eu estou tentando fazer aqui. Eu verifiquei com várias fontes diferentes e tentei isso várias vezes sem sucesso.

Comandos que usei:

sort -k 1,1 FileA.txt

join -j 1 File1.txt FileA.txt > output.txt

EDITAR:

Aqui está uma amostra da saída desejada

18      3320671 rs375411568
18      3320673 rs550898405
18      3320676 rs73366565
18      3320704 rs536519819
18      3320720 rs118037107
18      3320736 rs566910986
18      3320755 rs567626849
18      3320786 rs183777311
18      3320860 rs528977928
18      3320887 rs577743595
18      3320897 rs530122744

Parece muito semelhante ao exemplo anterior de arquivos 1-22, e isso é essencialmente porque é a mesma coisa. Eu quero para correspondências entre colunas 1 e 3 do arquivo A com colunas 1 e 2 do arquivo x (x sendo qualquer arquivo de uma série de arquivos numerados 1-22; neste exemplo, 18), uma linha correspondente com a linha correspondente do arquivo x aparece e é salvo em output.txt.

    
por CelineDion 22.08.2018 / 21:26

1 resposta

0

Ok, na verdade esqueci que fiz essa pergunta, mas alguém acabou de votar nesse post e, desde então, descobri que vou postar a resposta.

Para o primeiro snippet de saída listado acima,

10      10011300        10011301        T       C
10      10012494        10012495        G       A
10      10028691        10028692        A       T
10      10093496        10093497        G       A
10      10102457        10102458        C       T
10      10103252        10103253        G       C
10      10122271        10122272        T       C
10      10128778        10128779        T       C
10      10130299        10130300        C       A
10      10148307        10148308        G       A

tudo que eu precisava fazer era usar o seguinte comando awk,

cat [inputfile.txt] | awk '{print $1"_"$3"\t"$4"\t"$5}' | sort -k1,1 > outputfileA.txt

A saída ficaria assim e todas as linhas seriam classificadas pela primeira coluna:

10_10011301        T       C
10_10012495        G       A
10_10028692        A       T
10_10093497        G       A

Eu também faria o mesmo para o segundo trecho de código,

1       10177   rs367896724
1       10235   rs540431307
1       10352   rs555500075
1       10505   rs548419688
1       10506   rs568405545

e use um comando awk similar para gerar outro arquivo:

cat [inputfile.txt] | awk '{print $1"_"$2"\t"$3}' | sort -k1,1 > outputfileB.txt

Como resultado:

1_10177   rs367896724
1_10235   rs540431307
1_10352   rs555500075
1_10505   rs548419688
1_10506   rs568405545

Como esses dois arquivos de saída têm uma coluna em comum e essas colunas são classificadas de forma idêntica, podemos invocar o comando de união:

join -1 1 -2 2 outputfileA.txt outputfileB.txt | tr ' ' '\t' > outputfileC.txt

tr ' ' '\t' traduz todos os espaços em branco nas guias na saída. Todas as linhas com correspondências idênticas entre a primeira coluna do primeiro arquivo e a primeira coluna do segundo arquivo são gravadas no arquivo de saída, que pode ter a seguinte aparência:

1_101850899     A       C       rs138958619
1_101856556     T       C       rs191666242
1_101867058     C       T       rs188447998
1_101874381     A       C       rs143747209
1_101877269     G       A       rs186149522
1_101878704     C       A       rs192815769
1_101885657     G       T       rs150829467
1_101891797     T       G       rs141886478
1_101893793     T       A       rs182950692
1_101897192     T       C       rs189527356

Espero ter explicado isso bem. Deixe-me saber se preciso esclarecer alguma coisa.

    
por 07.09.2018 / 20:38