使用“diff”比较文件 1 和文件 2 中的用户名(包含电子邮件)

使用“diff”比较文件 1 和文件 2 中的用户名(包含电子邮件)

我正在尝试识别活跃账户和死亡账户,并想知道是否可以diffgrepsed一起regex使用,而不是编写一个长程序。

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

每个文件包含大约 1000 次,我需要经常这样做,大约每周一次。

任务
-检查 File1 中的用户名是否存在于 File2 中。在上面的示例数据中,它们存在。-如果
它们存在,则在 File1 中将它们注释掉。

过去,我曾使用 diff 来比较文件,并使用正则表达式来忽略行。但不幸的是,我无法理解如何忽略或仅考虑电子邮件中的一部分字符串。(因为 @ 及其后的任何内容都不可比较)

任何援助将不胜感激。 :)

答案1

您可以使用任何知道哈希/字典/关联数组/无论其称之为功能的脚本语言来实现这一点。

一个非常非常简单的方法是这样的:

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

可能,您可以看到这个并没有修改输入文件中的任何内容,只是写入标准输出。

编辑:将输出重定向到一个文件并重命名,这将显示为原始文件中的更改,此处称为 File1(对原始文件进行备份是总是一个好主意):

$> 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:让我们不要太拘泥于字面意思:

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

相关内容