如何使用BASH比较两个文本文件是否完全相同?

6
假设我有两个文本文件需要提取数据。这两个文件的文本内容如下: 文件1:
1name - randomemail@email.com
2Name - superrandomemail@email.com
3Name - 123random@email.com
4Name - random123@email.com

File 2:

email.com
email.com
email.com
anotherwebsite.com

文件2是从电子邮件地址中提取出来的文件1域名列表。这些域名绝非相同,而且相当随机。

我该如何从文件1中获取与文件2匹配的域名结果?

先谢谢您!

5个回答

8
假设顺序不重要,
grep -F -f FILE2 FILE1

这应该能解决问题。(这个方法有效是因为一个鲜为人知的事实:对于grep命令来说,-F选项不仅意味着“匹配这个固定字符串”,还意味着“匹配任何这些以换行符分隔的固定字符串”)。


你真是救命恩人。谢谢!我们有没有办法以相同的格式显示回来,例如姓名-电子邮件地址? - user1742682
它会打印出FILE1中包含FILE2中任何字符串的完整行。这不是你想要的格式吗? - zwol
我的错误!现在它运行得很好!是我的格式有问题。谢谢!:D - user1742682

2

这个配方:

join <(sed 's/^.*@//' file1|sort -u) <(sort -u file2) 

它将输出file1和file2中所有域名的交集。

2

请查看BashFAQ/036,了解此类问题的常见解决方案。


1
使用VimDIFF命令,这将呈现出差异的漂亮展示。

1
我发现它比 grep -F -f FILE2 FILE1 更好。 - Totalys

0

如果我理解正确,您想筛选出所有在文件2中提到的主机地址。

然后,您可以循环遍历文件2并使用@<line>进行grep,将结果累积到一个新文件或类似的东西中。

例如:

cat file2 | sort -u | while read host; do grep "@$host" file1; done > filtered

正确!但是在文件1中使用姓名-电子邮件地址格式。这可能看起来毫无意义,但对我来说确实有意义! - user1742682
这将会为文件2中的每一行读取文件1的所有内容。这种方法或许能完成任务,但效率非常低下。 - jordanm
@jordanm同意。我完全支持grep -f -F的解决方案。我试图从概念上进行说明。 - nemo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接