Awk para mesclar vários arquivos com coluna comum

1

Eu tenho uma pergunta sobre o comando awk no unix para mesclar várias tabelas com um valor comum

Tab1

Geneid  Chr Start   End Strand  Length Sample_1
ENSG00000278267 1   17369   17436   -   68  0
ENSG00000243485 1;1;1   29554;30267;30976   30039;30667;31109   +;+;+   1021    0

Separador 2

Geneid  Chr Start   End Strand  Length Sample_2
ENSG00000278267 1   17369   17436   -   68  0
ENSG00000243485 1;1;1   29554;30267;30976   30039;30667;31109   +;+;+   1021    0

Guia 3

Geneid  Chr Start   End Strand  Length Sample_3
ENSG00000278267 1   17369   17436   -   68  0
ENSG00000243485 1;1;1   29554;30267;30976   30039;30667;31109   +;+;+   1021    0

Como você pode ver, o Geneid é semelhante nessas tabelas, e eu gostaria de mesclar esses arquivos em 1 com a coluna GeneID e a coluna "Sample_n"

awk 'NR==FNR {h[$1] = $7; next} {print $1,$7,h[$1]}' Sample_1.txt Sample_2.txt | head

Se eu não sinto falta de algo, isso significa: NR == FNR, o primeiro arquivo é o modelo para a saída {h [$ 1] = $ 7; next} h contém o GeneID do arquivo 1 associado ao valor na sétima coluna {print $ 1, $ 7, h [$ 1]} imprime a primeira / sétima / coluna do segundo arquivo para o GeneID contido no valor h

Este trabalho para 2 arquivos, mas não para 3 ou mais

Geneid Sample_1 Sample_2
ENSG00000278267 0 0 
ENSG00000243485 0 0 

Eu olhei neste site, e as pessoas postaram todo o código, mas eu realmente não entendo o comando, então alguém sabe como mesclar esses arquivos e pode explicar os parâmetros no comando?

    
por Nicolas 07.09.2018 / 14:11

1 resposta

2
awk '
    {samples[$1] = samples[$1] OFS $NF} 
    END {
        # print the header first
        print "Geneid", samples["Geneid"] 
        delete samples["Geneid"]
        # and then the rest of the data
        for (geneid in samples) print geneid, samples[geneid]
    }
' Tab*

Canalize a saída em | column -t se você quiser alinhar as colunas

    
por 07.09.2018 / 14:54

Tags