Isso é um pouco complexo demais para ser legível como um liner, então aqui está um script gawk
comentado:
#!/usr/bin/gawk -f
## Save the data in array data: data[M][INS]=dinucleotide
NR==FNR{
data[$2][$1]=$3;
next
}
## Save the groups in array groups: groups[GRN][INS]
{
groups[$1][$2]++
}
## Now that everything is stored in memory, analyze
END{
## Get averages: for each group
for(group in groups){
## For each INS in this group
for(ins in groups[group]){
## For each MN in the data file
for(m in data){
## If this INS had a value for this M
if(data[m][ins]){
## This counts the number of times this dinucleotide
## (data[m][ins]) was found in this M among the INSs
## of this group.
num[group][m][data[m][ins]]++
## My version of gawk doesn't seem to support
## length for multidimensional arrays, so this array
## only exists to count the number of Ms of this group.
len[group][m]++;
}
}
}
}
## Foreach group of the groups file
for(group in num){
## For each M of this group
for(m in num[group]){
## For each INS of this group
for(ins in groups[group]){
## If this INS has a value for this m in
## the data file, print it.
if(data[m][ins]){
printf "%-5s %s %s\n", ins,m,data[m][ins]
}
## If it doesn't, check if there's an nt at
## >=70% for this group and print that
else{
for(nt in num[group][m]){
if(num[group][m][nt]*100/len[group][m] >= 70){
printf "%-5s %s %s\n", ins,m,nt
}
}
}
}
}
}
}
Salve o arquivo como foo.awk
, torne-o executável chmod +x foo.awk
e execute-o em seus arquivos:
$ ./foo.awk data groups
INS1 M1 AA
INS2 M1 AA
INS14 M1 AA
INS3 M1 AA
INS16 M1 AA
INS17 M1 AA
INS7 M1 AA
INS1 M2 GG
INS14 M2 GG
INS3 M2 TT
INS7 M2 TT
INS1 M3 AA
INS2 M3 TT
INS14 M3 AA
INS3 M3 AA
INS16 M3 AA
INS17 M3 AA
INS7 M3 AA
INS9 M1 GG
INS15 M1 AA
INS5 M1 GG
INS6 M1 GG
INS8 M1 GG
INS9 M2 TT
INS15 M2 TT
INS5 M2 GG
INS6 M2 TT
INS8 M2 TT
INS9 M3 AA
INS15 M3 TT
INS5 M3 TT
INS6 M3 TT
INS8 M3 TT
INS10 M1 AA
INS11 M1 AA
INS12 M1 GG
INS13 M1 AA
INS4 M1 GG
INS10 M2 GG
INS11 M2 GG
INS12 M2 GG
INS13 M2 GG
INS4 M2 GG
INS10 M3 TT
INS11 M3 TT
INS12 M3 TT
INS13 M3 TT
INS4 M3 TT
Observe que essa abordagem requer o carregamento de todo o conjunto de dados (os dois arquivos) na memória. Eu realmente não vejo uma maneira de contornar isso, já que você precisa ler a coisa toda antes de saber se há casos de > = 70%. A única outra abordagem em que posso pensar envolveria o processamento do arquivo várias vezes. Deixe-me saber se o carregamento na memória é um problema e verificarei se posso criar uma opção diferente.