【问题标题】:Comparing two huge files in Unix比较 Unix 中的两个大文件
【发布时间】:2015-12-21 16:21:29
【问题描述】:

要求是比较两个巨大的Unix文件,并在搜索几个选项后根据唯一键(第一个字段)将差异写入第三个文件,得到以下命令:

awk 'FNR==NR{a[$0];next}!($0 in a)' hosts.csv masterlist.csv>results.csv

虽然这给出了差异,但如果对于一个字段,一个文件包含 NULL(作为一个单词)和其他空值/空格,如何在命令中忽略这一点并比较其他字段?

还想用这些选项制作一个通用脚本或实用程序,不需要代码,但只是一个建议会有所帮助。

【问题讨论】:

  • diff 不是一个选项吗?
  • 请发minimal reproducible example,否则太抽象了,不知道你在找什么。
  • @commuSoft: 尝试使用 sdiff -W... 但也需要忽略 Null .. 所以检查我们是否有更好的方法
  • 听起来您对匹配的内容有非常具体的要求。尝试处理文件以将所有 NULL 更改为空格,然后比较它们。
  • @Neil Masson:用“sed '/NULL//g' 文件名”尝试了那个选项......因为这会贯穿整个文件,然后是匹配操作......会不会有那么激烈命令?

标签: linux unix awk


【解决方案1】:

您可以在 awk 中尝试此修复:

awk 'FNR==NR{if ($0 !~ /NULL|  *|^$/){a[$0]}next}!($0 in a)' hosts.csv masterlist.csv>results.csv

正如@fedorqui 在 cmets 中建议的那样,这是另一种选择:

awk 'FNR==NR{if ($0 !~ /NULL/ && NF){a[$0]}next}!($0 in a)' hosts.csv masterlist.csv>results.csv

【讨论】:

  • 你可以检查NF来去掉空行或只有空格的行。
  • @klashxx:是的,您的命令在一定程度上有所帮助,但是由于无法完全比较不良数据
【解决方案2】:

尝试使用二进制比较它们。如果将文件压缩为二进制文件(序列化),则可以非常快速地比较它们。如果有差异,您可以浏览文件并使用与 git 类似的方法进行比较...检查他们的源代码。希望这会有所帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-17
    • 2013-09-25
    • 1970-01-01
    • 2016-10-23
    • 2014-10-12
    • 1970-01-01
    相关资源
    最近更新 更多