我正在尝试识别活跃账户和死亡账户,并想知道是否可以diff
与grep
或sed
一起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"