Sie können dies mit jeder Skriptsprache erreichen, die Hashes / Wörterbücher / assoziative Arrays / was auch immer die Funktion nennt, kennt.
Ein sehr sehr einfacher Ansatz wäre so:
$> cat File1 johndoe janedoe nosuchkid $> cat File2 johndoe@email.com janedoe@email.com $> awk -F'@' 'FILENAME=="File2" { emails[$1]=$0; next}; { print ($1 in emails) ? $1 : "# "$1}' File2 File1 johndoe janedoe # nosuchkid
Wahrscheinlich können Sie sehen, dass diese nichts in den Eingabedateien ändert, sondern nur stdout schreibt.
BEARBEITEN: Umleiten der Ausgabe in eine Datei und Umbenennen, die hier als Änderungen in der Originaldatei mit dem Namen Datei1 erscheinen würden (eine Sicherung der Originaldatei ist immer eine gute Idee):
$> 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: Lassen Sie uns etwas weniger wörtlich sein:
$> 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"