Você pode conseguir isso usando qualquer linguagem de script que conheça hashes / dicionários / matrizes associativas / qualquer que seja o recurso.
Uma abordagem muito muito simples seria assim:
$> cat File1
johndoe
janedoe
nosuchkid
$> cat File2
[email protected]
[email protected]
$> awk -F'@' 'FILENAME=="File2" { emails[$1]=$0; next}; { print ($1 in emails) ? $1 : "# "$1}' File2 File1
johndoe
janedoe
# nosuchkid
Provavelmente, você pode ver que este não modifica nada nos arquivos de entrada apenas grava stdout.
EDITAR: Redirecionando a saída para um arquivo e renomeando o que apareceria como alterações no arquivo original chamado File1 aqui (fazer um backup do arquivo original é sempre uma boa idéia):
$> awk -F'@' 'FILENAME=="File2" { emails[$1]=$0; next}; { print ($1 in emails) ? $1 : "# "$1}' File2 File1 > File1.tmp ; cp File1 File1.old ; mv File1.tmp File1
$> cat File1
johndoe
janedoe
# nosuchkid
EDIT2: Vamos ser um pouco menos literais:
$> export PERSONFILE=File1 EMAILFILE=File2; awk -F'@' 'FILENAME==ENVIRON["EMAILFILE"] { emails[$1]=$0; next}; { print ($1 in emails) ? $1 : "# "$1}' "$EMAILFILE" "$PERSONFILE" > "$PERSONFILE.tmp" ; cp "$PERSONFILE" "$PERSONFILE.old" ; mv "$PERSONFILE.tmp" "$PERSONFILE"