【问题标题】:Compare file1 and file2 but show only new lines which are not in file2比较 file1 和 file2 但只显示不在 file2 中的新行
【发布时间】:2014-05-27 14:44:01
【问题描述】:

我目前正在努力完成比较两个文件的任务。这两个文件的值都有差异和新行。示例:

文件1:

Germany=Munich
Swiss=Bern
Austria=Wien
Italy=Rom

文件2:

Germany=Berlin
Swiss=Bern
Italy=Rom

我的操作的结果应该如下:

输出文件:

Austria=Wien

我怎样才能获得仅不在 file2 中的输出文件的行?我对线条的差异不感兴趣。只是缺少一条完整的线。

我已经尝试过 diff 和 sdiff,但没有得到想要的结果。

谢谢

【问题讨论】:

  • 如果在文件 1 中有 Germany=Munich Swiss=Bern Austria=Wien Italy=Rom 并且在文件 2 中:Germany=Hambourg(例如) Swiss=Bern Italy=Rom 结果是什么?
  • @angel 我假设 OP 只需要在 file2 中找不到第一个字段的行。

标签: bash awk sed grep diff


【解决方案1】:

这应该有效:

awk -F= 'NR==FNR{a[$1]=$0;next}!($1 in a)' file2 file1
Austria=Wien

我们首先读取了在国家/地区索引的整个文件 2。我们检查文件1中是否不存在该国家并打印它。这不会为您提供 file2 中但不在 file1 中的行的结果,但也可以对其进行调整以提供给您。我不确定这是否是您的要求。如果是,请更新您的问题以反映您的所有用例以获得更完整的答案。

【讨论】:

  • 谢谢,这正是我想要的结果。
【解决方案2】:

如果您不关心排序,可以对文件进行排序,然后使用join

sort file1 > file1.srt
sort file2 > file2.srt
join -t'=' -v1 file1.srt file2.srt

join 的标志指定使用等号作为字段分隔符,包括来自 file1.srt 的不可配对行,同时禁止来自 file1.srt 的可配对行。

【讨论】:

  • -a1-v1 都需要吗?手册页听起来好像您只需要 -v1 在这里。
  • @EtanReisner 不,我想不是。我相信我误读了-v 的手册页条目。感谢您了解这一点。
【解决方案3】:

这可能对你有用(GNU sed):

sed -r 's#([^=]*=).*#/^\1/d#' file2 | sed -f - file1

使用 file2 作为 sed 脚本的基础,并针对 file1 运行此 sed 脚本

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    相关资源
    最近更新 更多