【问题标题】:Get the intersection and difference between two huge files获取两个大文件之间的交集和差异
【发布时间】:2015-02-04 03:36:08
【问题描述】:

我有两个大文件,每个文件有 400、000、000 多行,大小超过 13GB,每行包含一个 md5 数字(32 字节)。我想得到两个文件之间的交集,也想得到它们的区别。我想知道是否有一种简单而快速的方法来做到这一点,比如使用 linux shell 命令。

【问题讨论】:

  • 请澄清一下:1)一个md5数字可以在同一个文件中出现多次吗? 2) 这些 md5 数字是否已排序? 3)定义你所说的交叉点是什么意思?例如,如果两个文件都包含所有相同的数字但只是顺序不同,那么在您的交集/差异定义中,它们是否被视为相同?即您正在尝试查找两个文件中出现的数字,以及仅在其中一个文件中出现的数字(以及输出哪个文件)?
  • 也许只有diff <(sort file1) <(sort file2) 就可以完成这项工作?
  • 感谢您的评论,1)每个 md5 数字在文件中只出现一次 2)数字已排序 3)交集表示公共数字,不考虑顺序

标签: linux shell grep uniq


【解决方案1】:

假设文件已排序,那么comm 将完成这项工作:

交点(两个文件中的线):

comm -12 file1 file2

差异(一个文件中的行而不是另一个文件):

comm -3 file1 file2

请注意,在第二种情况下,仅file2 中的行将由制表符缩进;如果要删除它,请通过 sed 过滤输出。

如果文件尚未排序,您可以使用 process substitution 即时进行排序:

comm -12 <(sort file1) <(sort file2)
comm -3  <(sort file1) <(sort file2)

你也可以运行一次命令;以 0 标签开头的行仅在 file1 中;以 1 标签开头的仅在 file2 中;以 2 个标签开头的那些都在两个文件中。

【讨论】:

    猜你喜欢
    • 2017-02-14
    • 2019-03-26
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多