Com awk leia file2 primeiro e economize $1 em seen[$1] , em seguida, leia file1 e, se $1 não foi "visto", substitua-o por NoMatch :
awk 'FNR==NR{seen[$1]++; next}
{(FNR==1 || ($1 in seen)) || $1="NoMatch"};1' file2 file1
Se você preferir join , precisará de entrada classificada. Você terá que extrair o head er de file1 first, sort as linhas restantes e então join o resultado com o sort ed file2 :
{ head -n1; sort | join -j1 -a1 -e "NoMatch" -o 2.1 1.2 - <(sort file2); } <file1
e, se necessário, canalize tudo para uniq para evitar linhas duplicadas:
{ head -n 1; sort | \
join -j1 -a1 -e "NoMatch" -o 2.1 1.2 - <(sort file2) | \
uniq; } <file1