【问题标题】:Comparing two lists with a shell script用 shell 脚本比较两个列表
【发布时间】:2010-12-08 16:29:35
【问题描述】:

假设我在文件 f1、f2 中有两个数字列表,每行一个数字。我想看看第一个列表中有多少数字不在第二个列表中,反之亦然。目前我正在使用 grep -f f2 -v f1 然后使用 shell 脚本重复此操作。这很慢(二次时间很痛)。有更好的方法吗?

【问题讨论】:

  • shell 脚本中有字典/哈希表吗?
  • 文件的格式是什么?每行一个数字?字符应该代表整数还是浮点数? python脚本可以吗?
  • 这里是一些关于 bash 中关联数组的信息:stackoverflow.com/questions/688849/…
  • 每行一个数字。整数。我实际上并不想要 Python 脚本,因为我正在尝试学习更多的 shell 脚本。 (shell脚本的最初目的是检查我的python程序是否正常工作)

标签: shell associative-array


【解决方案1】:

你不能把每个数字放在一行然后diff(1) 吗?您可能需要事先对列表进行排序,但这样才能正常工作。

【讨论】:

  • 那真的会提供计数吗?
  • 不是这样,但之后你可以通过grep/wc 得到它。这只是关于如何改进二次运行时间的建议。您会以某种方式(取决于diff 的选项)获得可读的差异列表。那么,你可以数一数。
  • 好的,将不得不玩这个
  • diff 将有一个 表示第一个但不是第二个中的值。一个简单的 grep 和 wc 应该提供所需的答案
【解决方案2】:

一个文件是另一个文件的子集的特殊情况,如下:

cat f1 f2 | sort | uniq -u

将列出仅在较大文件中的行。当然,wc -l 的管道会显示计数。

但是,这与您描述的不完全一样。

这种单线经常满足我的特殊需求,但我希望看到更通用的解决方案。

【讨论】:

    【解决方案3】:

    我喜欢用“comm”来表达这种东西。 (文件需要排序。)

    $ cat f1
    1
    2
    3
    $ cat f2
    1
    4
    5
    $ comm f1 f2
            1
    2
    3
        4
        5
    $ comm -12 f1 f2
    1
    $ comm -23 f1 f2
    2
    3
    $ comm -13 f1 f2
    4
    5
    $ 
    

    【讨论】:

    • 对于数字结果,它抱怨它没有按排序顺序。 --nocheck-order 将禁止
    • 再次,简单的 grep 和 wc 可以找到实际结果
    猜你喜欢
    • 1970-01-01
    • 2015-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-16
    • 2021-03-28
    • 1970-01-01
    • 2011-02-15
    相关资源
    最近更新 更多