Manipulação de tabelas

2

Eu tenho três arquivos com coordenadas do genoma e a última coluna como nomes comuns

Arquivo 1.

X 1 100 B
Y 101 200 B
Z 1 50 B

Arquivo 2.

X 200 300 A 
Y 101 200 A
Z 1 50 A

Arquivo 3.

X 1 100 C
Y 200 300 C
Z 1 50 C

Eu gostaria de manipular meus dados de acordo com a última coluna

Name Value1 Value2 A B C
X 1 100 No Yes Yes
X 200 300 Yes No No
Y 101 200 Yes Yes No
Y 200 300 No No Yes
Z 1 50 Yes Yes Yes

.. assim.

Você poderia ajudar?

    
por DS123 09.10.2017 / 16:24

2 respostas

1
Solução

Awk :

awk 'function get_mask(keys){ 
         mask=""; 
         for(i in h) { 
             res=(keys~i)?"Yes":"No"; mask=(mask!="")? mask FS res:res 
         } 
         return mask 
     }
     { k=$1 FS $2 FS $3 }{ h[$4]; a[k]=(a[k])? a[k]$4:$4 }
     END{ 
         h_line=""; for(i in h) h_line=(h_line=="")? i:h_line FS i;
         printf "Name Value1 Value2 %s\n",h_line;
         for(j in a) printf "%s %s\n", j, get_mask(a[j]) 
     }' file{1,2,3}

A saída:

Name Value1 Value2 A B C
Z 1 50 Yes Yes Yes
Y 101 200 Yes Yes No
Y 200 300 No No Yes
X 1 100 No Yes Yes
X 200 300 Yes No No
    
por 09.10.2017 / 17:14
0

Muito semelhante à resposta de Roman, mas acho um pouco mais simples

gawk '
    { key = $1 FS $2 FS $3; names[$NF] = 1; has_name[key][$4] = 1 }
    END {
        PROCINFO["sorted_in"] = "@ind_str_asc"
        printf "Name Value1 Value2"
        for (v in names) printf " %s", v
        print ""
        for (key in has_name) {
            printf "%s", key
            for (v in names) printf " %s", has_name[key][v] ? "Yes" : "No"
            print ""
        }
    }
' file{1,2,3}
Name Value1 Value2 A B C
X 1 100 No Yes Yes
X 200 300 Yes No No
Y 101 200 Yes Yes No
Y 200 300 No No Yes
Z 1 50 Yes Yes Yes

Usa a variável% awk PROCINFO do GNU para travessia de matriz de controle na ordem classificada.

    
por 09.10.2017 / 17:37