Utilisation de 'diff' pour comparer les noms d'utilisateur de fichier1 à fichier2 contenant des courriels

0

J'essaie d'identifier les comptes actifs par rapport aux comptes morts et je me demandais si diff, avec grepou sedou regexpouvait être utilisé, au lieu d'écrire un long programme.

File1 (usernames)                  File2 (emails)
janedoe                            [email protected]
johndoe                            [email protected]

Chaque fichier contient environ 1000 fois et je dois le faire fréquemment, environ une fois par semaine.

Tâche
-Vérifiez si les noms d'utilisateur du fichier1 existent dans le fichier2. Dans les exemples de données ci-dessus, ils existent.
-Si ils existent, commentez-les dans Fichier1.

Dans le passé, j’utilisais diff pour comparer des fichiers et regex pour ignorer les lignes. Mais malheureusement, je ne peux pas envelopper mon cerveau pour ignorer ou ne considérer qu'une partie de la chaîne des emails. (Depuis @ et tout ce qui suit n'est pas comparable)

Toute aide serait appréciée. :)

Boucle ennuyeuse
la source

Réponses:

1

Vous pouvez y parvenir en utilisant n’importe quel langage de script connaissant les hachages / dictionnaires / tableaux associatifs / quel qu’il soit appelé la fonctionnalité.

Une approche très très très simple serait la suivante:

$> 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

Probablement, vous pouvez voir que celui-ci ne modifie rien dans les fichiers d'entrée mais écrit stdout.

EDIT: Réorienter la sortie dans un fichier et renommer ce qui apparaîtrait ici sous forme de modifications dans le fichier d'origine appelé File1 (effectuer une sauvegarde du fichier d'origine est toujours une bonne idée):

$> 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: Soyons un peu moins littéraux:

$> 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"
Gombai Sándor
la source
Mais awkne peut pas écrire la sortie dans le fichier d'entrée. Ce qui est une nécessité.
Boring Loop
Rien ne vous empêche de rediriger la sortie vers un nouveau fichier et de renommer le nouveau fichier en File1. En fait, c'est ce que tout programme ferait à l'intérieur lorsqu'il travaille sur des fichiers texte sans octet dédié dans le fichier aux fins d'indicateur.
Gombai Sándor
Pouvez-vous fournir une solution en utilisant votre réponse. Comme je ne suis pas familier avec awket ses propriétés.
Boring Loop
Ok, l'a fait. En réalité, pour la redirection et le changement de nom, aucune autre fonctionnalité n'est requise par rapport à celle fournie par le système d'exploitation de base.
Gombai Sándor
Puis-je assigner la variable File1 & File2, aux noms de fichiers actuels ou je dois taper les noms de fichiers dans la commande.
Boring Loop