优秀的编程知识分享平台

网站首页 > 技术文章 正文

解密文件数据:获取共有行和差集的高效方法

nanyue 2024-10-16 11:07:10 技术文章 5 ℃



如何获取两个文件中的共有行(集合的交集)或只在其中一个文件中的行(集合的差集)?

使用 comm(1) 命令是一种获取两个文件中共有行或只在一个文件中的行的方法:

请阅读 comm? 命令的手册以了解更多详细信息。上述命令中使用了进程替代(process substitution)。

如果由于某种原因你没有 comm? 程序,或者正在寻找替代方法,你可以使用以下其他方法。方法一使用 grep?,方法四使用 awk?。这两种方法比上述的 comm + sort? 更快,但是其中一个数据文件将被加载到内存中,因此在处理非常大的文件时不太适用。

  1. 使用 grep?? 的实现是一种简单且快速的方法,适用于将一个包含 30,000 行的文件与一个包含 400,000 行的文件进行匹配,仅需 20 秒。
  • 该方法让 grep?? 从文件中读取一个模式列表(使用 -f??),将这些模式视为纯字符串而不是正则表达式(使用 -F??),并仅匹配整行(使用 -x??)。
  • 注意,使用 -f?? 指定的文件将被加载到内存中,因此对于非常大的文件,这种方法不适用。
  • 它应该适用于任何 POSIX 兼容的 grep??;在旧的系统上,你可能需要使用 fgrep?? 而不是 grep -F??。
  1. 使用 sort?? 和 uniq?? 的实现:


  1. 另一种差集的实现:
  • 这种方法可能会在行的开头引入额外的空格,如果这是个问题,你可以将其去除。
  • 此方法还假设 file1 和 file2 都不包含任何重复项。
  • 最后,它会对输出进行排序。如果这是个问题,那么你将不得不完全放弃这种方法。也许你可以使用 awk?? 的关联数组(或者 perl?? 的哈希表或 tcl?? 的数组)来替代。
  1. 使用 awk?? 实现差集和交集,无论输入文件是否已排序或包含重复项:

更多

如果您觉得文章内容对你有一点帮助可以关注我,我在头条平台会持续分享更多实用的shell技巧和最佳实践,如果想系统的快速学习shell的各种高阶用法和生产环境避坑指南可以看看《shell脚本编程最佳实践》专栏,专栏里有更多的实用小技巧和脚本代码分享。

最近发表
标签列表