【问题标题】:How to find duplicate lines across 2 different files? Unix如何在 2 个不同的文件中查找重复行? Unix
【发布时间】:2013-03-18 05:25:03
【问题描述】:

在 unix 终端上,我们可以使用diff file1 file2 来查找两个文件之间的差异。是否有类似的命令来显示 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

【问题讨论】:

  • 你的文件是什么样的?
  • 大多数时候是一串人类语言的句子。有时也会列有更多信息。
  • 也许您可以举两个简单文件的示例以及您希望从该输入中获得的那种输出?我不清楚你到底想要达到什么目的。了解更多这样做的动机也会有所帮助,因为有人可能有不同的方法来解决您的问题。
  • 您希望输出是两个文件共有的行的列表?

标签: file unix diff similarity


【解决方案1】:

如果你想得到一个重复行的列表而不求助于AWK,你可以使用-d flag to uniq:

sort file1 file2 | uniq -d

【讨论】:

  • 另外,删除 -d 可以让你得到两个文件中所有不同的行,这是我正在寻找的。​​span>
【解决方案2】:

正如@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 要好得多
  • awk 使用pattern { action } 表示法。由于这不在大括号中,因此它是一种模式。 $0 是当前行。 dup[$0] 是由行索引的关联数组;首次创建时,值为 0; dup[$0]++ 后递增值,所以第一次返回 0,第二次返回 1,以此类推。当它的值为 1 时,条件为真,因此执行默认操作(打印行)。跨度>
猜你喜欢
  • 2017-12-21
  • 2021-04-18
  • 2019-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多