Esta é uma operação amplamente conhecida em awk - coleta a matriz do arquivo-chave e, em seguida, usa a matriz para operar com os segundos valores de arquivo
awk '
FNR==NR{
A[$2] = A[$2] " " $1
next
}
$1 in A{
for(i=1;i<=split(A[$1], B);i++)
print $1 B[i]
}
' file2 file1
Ou um pouco mais curto:
awk '
FNR==NR{
A[$2] = A[$2] $2 " " $1 "\n"
next
}
$1 in A{
printf "%s", A[$1]
}
' file2 file1
Outra variante
grep -f <(cat -E file1) file2 |
sed 's/\(\S*\)\s*\(\S*\)/\t/' |
sort
Por fim, mais fácil (quanto a mim):
join -2 2 file1 <(sort -k2 file2)