Possível solução com awk
(vou editar, se necessário, porque é um pouco incerto da sua pergunta quais são os requisitos exatos):
awk 'FILENAME == ARGV[1] {
m[$2,$3] = 0; z[$2,$3] = $5;
next;
}
FILENAME == ARGV[2] {
if (($2,$3) in m) {
m[$2,$3] = 1;
z[$2,$3] = $5 " " z[$2,$3];
}
next;
}
{
if (($2,$3) in m && m[$2,$3] == 1) {
print $0 >"out.txt";
print $0 " " z[$2,$3] >"out2.txt";
}
}' file3.txt file2.txt file1.txt
Nós lemos o terceiro arquivo, criamos dois arrays com as chaves nas colunas 2 e 3, o primeiro array preenchido com zeros, o segundo com o valor requerido para o arquivo out2.txt. Então nós lemos o segundo arquivo e nós checamos se a chave da coluna 2 e 3 existe no primeiro array, se sim nós mudamos o valor de zero para um e nós concatenamos o valor requerido no segundo array para o arquivo out2.txt. Finalmente lemos o primeiro arquivo, checamos a chave existente e imprimimos valores interessantes nos arquivos out.txt e out2.txt, então:
out.txt deve conter:
1. abc 1 a f11 f13 f14
3. abe 4 d f13 f16 f12
out2.txt deve conter:
1. abc 1 a f11 f13 f14 f21 f31
3. abe 4 d f13 f16 f12 f24 f34