Linux 从uniq-c合并结果

Linux 从uniq-c合并结果,linux,merge,sorting,uniq,Linux,Merge,Sorting,Uniq,我有许多包含命令结果的文件: uniq-c some_file>some_file.out 例如: 1.1.3: 1A 2 b 4 c 2.出局 2 b 8 c 我想合并这些结果,因此我得到: 1 a 4 b 12 c 1A 4 b 12 c 我认为sort或uniq可以处理它,但我没有看到任何与之相关的选项。 编写一些ruby/perl脚本是一种方法,但我希望使用core*nix命令(如前面提到的sort和uniq)轻松地完成 编辑: 说清楚。我没有原始文件,必须合并*.out文件 谢谢你

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

例如: 1.1.3:

1A 2 b 4 c 2.出局

2 b 8 c 我想合并这些结果,因此我得到:

1 a 4 b 12 c 1A 4 b 12 c 我认为sort或uniq可以处理它,但我没有看到任何与之相关的选项。 编写一些ruby/perl脚本是一种方法,但我希望使用core*nix命令(如前面提到的sort和uniq)轻松地完成

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


谢谢你的帮助

awk
试试:

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

这是一个非常特殊的问题,因此默认情况下,任何工具都不可能做到这一点。您可以在一个足够小的循环中编写脚本(不需要awk nastyness),并用任何脚本语言(甚至sh)实现。我不认为还有别的办法。

这不太严重(但有效)。我喜欢菲利普斯的解决方案

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

接受的答案适用于问题中提供的特定值。但是,如果
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

我想应该有一个只涉及join、awk和expr的解决方案。好的,它应该适合我。这并不理想,因为我希望使用O(N)内存,其中N是文件数,但它会工作一段时间(除非我有大的结果)。谢谢我不认为它在文件数量上是线性的,因为
awk
一次一行地按顺序读取所有文件,它只需要在内存中保留
count
数组(哈希表?),我没有说Philipp给出的解决方案是线性的。我说可以写这样一个解决方案。
cat 1.out 2.out |
{
    while read line; do
        for i in $(seq ${line% *}); do
            echo ${line#* }
        done
    done
} | sort | uniq -c
awk '{ cnt=$1; $1=""; count[substr($0, 2)] += cnt } END { for(elem in count) print count[elem], elem }' 1.out 2.out