【问题标题】:Merge results from uniq -c合并来自 uniq -c 的结果
【发布时间】:2010-12-01 08:57:44
【问题描述】:

我有许多带有命令结果的文件: uniq -c some_file > some_file.out

例如: 1.出:

1个 2 乙 4℃

2.out

2 乙 8℃

我想合并这些结果,所以我得到:

1个 4 乙 12℃

我认为 sort 或 uniq 可以处理它,但我没有看到任何与之相关的选项。 编写一些 ruby​​/perl 脚本是一种方法,但我想使用核心 *nix 命令(如提到的 sort 和 uniq)轻松完成。

编辑: 要清楚。我没有原始文件,我必须合并 *.out 文件。

感谢您的帮助!

【问题讨论】:

  • 我想应该有一个只涉及join、awk和expr的解决方案。

标签: linux merge sorting uniq


【解决方案1】:

试试awk:

awk '{ count[$2] += $1 } END { for(elem in count) print count[elem], elem }' 1.out 2.out 

【讨论】:

  • 好的,它应该对我有用。这并不理想,因为我希望使用 O(N) 内存使用它,其中 N 是文件数,但它会工作一段时间(除非我有很大的结果)。谢谢!
  • 我不认为它在文件数量上是线性的,因为awk按顺序读取所有文件,一次一行,它只需要保留count数组(哈希表?) 在内存中。
  • 我没有说 Philipp 给出的解决方案是线性的。我说可以写成这样的解决方案。
【解决方案2】:

这是一个非常具体的问题,因此默认情况下任何工具都不太可能这样做。您可以在一个足够小的循环中编写脚本(不需要 awk 讨厌),用任何脚本语言(甚至 sh)实现。我认为没有其他方法。

【讨论】:

    【解决方案3】:

    这不是很严重(但它有效)。我喜欢 Philips 的解决方案。

    cat 1.out 2.out |
    {
        while read line; do
            for i in $(seq ${line% *}); do
                echo ${line#* }
            done
        done
    } | sort | uniq -c
    

    【讨论】:

      【解决方案4】:

      接受的答案适用于问题中提供的特定值。但是,如果uniq -c 的输出包含的空格多于计数和值之间的空格,则以下awk 脚本不会截断第二个字段之后的输出:

      awk '{ cnt=$1; $1=""; count[substr($0, 2)] += cnt } END { for(elem in count) print count[elem], elem }' 1.out 2.out
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-07-19
        • 2018-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-18
        相关资源
        最近更新 更多