【问题标题】:"Minus" operation on two files using Linux commands使用 Linux 命令对两个文件进行“减”操作
【发布时间】:2009-09-03 01:19:05
【问题描述】:

我有 4 个按字母顺序排序的文件,A、B、C 和 D。 这些文件的每一行都包含一个字符串。 本质上,需要发生的是从 A 中删除 B 中的任何内容。 其结果将被删除 C 中的任何内容。 同样,其结果将被剥夺 D。

有没有办法使用 Linux 命令来做到这一点?

【问题讨论】:

  • Diff 可能会起作用。为什么你给出提示却提出问题?这是作业吗?
  • 不。如果你给它正确的标志,实际上 diff 会起作用。但我不确定这些标志。

标签: linux


【解决方案1】:

comm 对此也有好处:

cat B C D | sort | comm -2 -3 A -

或:

comm -2 -3 A B | comm -2 -3 - C | comm -2 -3 - D

取决于您的脚本更容易/更清晰。

【讨论】:

  • 我想说这是迄今为止给出的最简单的答案。
【解决方案2】:
grep -x -v -f B A | grep -x -v -f C | grep -x -v -f D

-v 开关是反向匹配(即匹配所有除外)。 -f 开关获取一个包含要匹配的模式列表的文件。 -x 开关强制它匹配整行(这样作为其他行的子字符串的行不会导致较长的行被删除)。

【讨论】:

  • 如果文件 B 为空白,这将失败。
【解决方案3】:

查看join 命令。阅读它的手册页,你应该会找到你想要的。

【讨论】:

    【解决方案4】:
    join A B | join - C | join - D
    

    【讨论】:

    • 这不是和你想要的完全相反吗?这将为您提供所有四个文件中都存在的行。另外,如果您的任何行中有空格,则它不起作用。
    • 是的。抱歉,直接加入应该可以。
    • 但是...我不是 join 方面的专家,但是通过阅读手册页,join A B 会给你 A 和 B 中的所有行,而不是 A 中的行而不是 B ,这是你问的。据我所知,基于加入的答案对您的原始问题将类似于:join -t \n -v 1 A B | join -t \n -v 1 - C | join -t \n -v 1 - D
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多