如何在两个不同的文件中查找重复行?Unix

18

在Unix终端中,我们可以使用diff文件1文件2命令查找两个文件之间的差异。是否有类似的命令显示两个文件之间的相似性?(如果必要,可以使用多个管道符。)

每个文件包含一行字符串句子;它们经过排序并使用sort file1 | uniq去除重复行。

file1: http://pastebin.com/taRcegVn

file2: http://pastebin.com/2fXeMrHQ

输出应该显示出同时出现在两个文件中的行。

output: http://pastebin.com/FnjXFshs

我能够使用Python来完成这个任务,但我认为在终端中输入太多了:

x = set([i.strip() for i in open('wn-rb.dic')])
y = set([i.strip() for i in open('wn-s.dic')])
z = x.intersection(y)
outfile = open('reverse-diff.out')
for i in z:
  print>>outfile, i

你的文件长什么样? - paulmelnikow
4
可能是重复的问题,如何显示共同行(反向diff)?(https://dev59.com/nHRB5IYBdhLWcg3wAjXR) - beatgammit
也许您可以举例说明两个简单文件以及您希望从该输入中获得的输出类型?我不太清楚您试图实现的确切目标。了解一下这样做的动机也会有所帮助,因为有人可能会采用不同的方法来解决您的问题。 - Martin Atkins
在给定的文件中,同一行是否可以出现多次?文件中的行顺序是否相关? - Jonathan Leffler
文件中不应该出现重复的行。我想在合并文件之前已经执行了 sort file1 | uniq 命令。由于排序已按字母顺序排序,因此行的顺序也不应该是问题。 - alvas
显示剩余3条评论
2个回答

35

如果您想获取重复行的列表而不使用AWK,则可以使用-d标志来运行uniq

sort file1 file2 | uniq -d

1
此外,去掉 -d 参数可以让你得到两个文件中所有不同的行,这正是我所需要的。 - Aaron

18

正如 @tjameson 所提到的,这个问题可能已经在另一个帖子中得到解决。 我想再发表一个解决方案: sort file1 file2 | awk 'dup[$0]++ == 1'

  1. 参考 awk guide 获取一些 awk 基础知识,当一行的模式值为真时,该行将被打印出来

  2. dup[$0] 是一个哈希表,其中每个键是输入的每一行,原始值为 0,每次出现此行时增加一次,当它再次出现时,值应为 1,因此 dup[$0]++ == 1 为真。然后打印这一行。

请注意,只有在两个文件中都没有重复项时,才能使用此方法,这也是问题中指定的。


你能解释一下 awk 'dup[$0]++ == 1' 是如何工作的吗?你的解决方案比混乱的 comm 好多了。 - alvas
1
awk使用模式 { 动作 }的符号表示法。由于这不在大括号中,所以它是一个模式。$0表示当前行。dup[$0]是由行索引的关联数组;当首次创建时,其值为0;dup[$0]++后自增变量,因此第一次返回0,第二次返回1等等。当其值为1时,条件为真,因此执行默认动作(打印该行)。 - Jonathan Leffler

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