Supondo que você queira as substituições no formato file_B.txt, como Spike sugeriu, um banco de dados leve como o sqlite poderia fazer isso.
O seguinte seria ler file_A.txt e file_B.txt em um banco de dados transiente na memória e exibir os resultados no arquivo TSV MODIFIED-file_B.txt
sqlite3 -separator $'\t' << EOF > MODIFIED-file_B.txt
CREATE TABLE a ( id INTEGER PRIMARY KEY, name );
.import file_A.txt a
CREATE TABLE b (id1 INTEGER,name1 TEXT,id2 INTEGER,name2 TEXT);
.import file_B.txt b
SELECT b.id1,
ifnull((SELECT name from a WHERE a.id=b.id1),b.name1),
b.id2,
ifnull((SELECT name from a WHERE a.id=b.id2),b.name2)
FROM b;
EOF
Isto lê cada arquivo em uma tabela separada, em seguida, imprime a tabela b com suas substituições A, se disponíveis, caso contrário, retorna o nome B_nome original.
Se o uso de memória for uma preocupação, você poderá executá-lo com um nome de arquivo, por exemplo. sqlite3 -separator $'\t' temporary.db
para criar um arquivo de rascunho.