【问题标题】:Performant way of displaying the number of unique column entries in a set of files?显示一组文件中唯一列条目数的高效方式?
【发布时间】:2017-08-30 10:23:11
【问题描述】:

我正在尝试将大量文件传送到一系列命令中,这些命令显示所述文件的给定列中唯一条目的数量。我对shell没有经验,但不久之后我就想出了这个:

awk '{print $5 }' | sort | uniq | wc - l

此命令序列适用于少量文件,但在我的目标集上执行所需的时间令人无法接受。有没有一组命令可以更有效地完成这个任务?

【问题讨论】:

  • 你可以用sort -u代替sort | uniq
  • 您实际上要处理多少行输入?您能否包含一小段示例输入数据,以便我们了解您真正想要做什么?还请在您提供的示例输入中包含您的预期输出。您是在每个文件或所有文件的第 5 列中查找唯一项目吗?

标签: shell unix awk command-line


【解决方案1】:

您可以使用 awk 一次性计算第五个字段中值的唯一出现次数:

awk '{if (!seen[$5]++) ++ctr} END {print ctr}'

这将在第五个字段中创建一个值数组,如果该值以前从未见过,则增加 ctr 变量。 END 规则打印计数器的值。

使用 GNU awk,您也可以只检查最后关联数组的长度:

awk '{seen[$5]++} END {print length(seen)}'

【讨论】:

    【解决方案2】:

    Benjamin 提供了良好的油,但取决于数组中要存储多少数据,无论如何将数据传递给 wc 可能是值得的:

    awk '!_[$5]++' file | wc -l
    

    【讨论】:

      【解决方案3】:

      使用 awk 但与 @BenjaminW 的先前版本相距不远的排序和最快(我可以)。由于在此过程中进行了较早的测试,我认为速度更快(差异只能在非常大的文件上引起关注)

      awk '!E[$5]++{c++}END{print c}' YourFile
      

      适用于所有 awk 版本

      【讨论】:

        【解决方案4】:

        GNU datamash 有一个列的 count 函数:

        datamash -W count 5
        

        【讨论】:

          猜你喜欢
          • 2019-09-03
          • 2010-12-05
          • 1970-01-01
          • 2020-07-29
          • 2019-06-26
          • 1970-01-01
          • 2021-07-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多